我在创建的类中遇到大量内存泄漏的问题。作业需要在堆上创建单词搜索难题。我已经创建了析构函数,复制了构造函数并重载了赋值运算符。
我认为这些函数之一肯定有问题,因为确保其正常运行的最后检查是在循环中创建对象,以查看其是否失败并且我的函数崩溃了。我尝试过使用不同形式的析构函数,并且尝试过更改复制和赋值运算符,但是没有运气。有点无所适从,而且缺少警告的确使没有适当了解堆就很难调试。
任何帮助将非常感激!
以下是一些正在使用堆的函数。
JumblePuzzle::~JumblePuzzle(){
for (int i = 0; i < size; ++i){
delete jumble[i];
}
delete jumble;
}
JumblePuzzle::JumblePuzzle(string word, string diff){
int i = 0;
toHide = word;
difficulty = diff;
jumble = buildArray();
fillArray();
hideWord();
}
JumblePuzzle::JumblePuzzle(JumblePuzzle& temp){
size = temp.size;
rowPos = temp.rowPos;
colPos = temp.colPos;
direction = temp.direction;
toHide = temp.toHide;
difficulty = temp.difficulty;
jumble = temp.getJumble();
}
JumblePuzzle& JumblePuzzle::operator=(const JumblePuzzle& right){
if (this != &right){
for (int i = 0; i < size; ++i){
delete jumble[i];
}
delete[] jumble;
size = right.size;
rowPos = right.rowPos;
colPos = right.colPos;
direction = right.direction;
toHide = right.toHide;
difficulty = right.difficulty;
jumble = right.getJumble();
}
return *this;
}
charArrayPtr* JumblePuzzle::buildArray() const{
charArrayPtr* array = new char*[size];
for (int i = 0; i < size; ++i){
array[i] = new char[size];
}
return array;
}
这是它失败的路线。
int loopLimit =20;
for (int i = 0; i < loopLimit; i++)
JumblePuzzle jp("HIDDENWORD", "hard");
感谢您的任何帮助!
编辑:
这也是我的.h文件。
#ifndef JUMBLE_H_
#define JUMBLE_H_
#include <time.h>
#include <cstdlib>
#include <string>
using namespace std;
typedef char* charArrayPtr;
class BadJumbleException {
public:
BadJumbleException(const string&);
string& what();
private:
string message;
};
class JumblePuzzle{
public:
JumblePuzzle(string, string); //simple constructor
JumblePuzzle(JumblePuzzle&); //copy constructor
~JumblePuzzle(); //deconstructor
charArrayPtr* getJumble() const;
JumblePuzzle& operator=(const JumblePuzzle&);
//accessors
int getSize();
int getRowPos();
int getColPos();
char getDirection();
private:
//attributes
int size;
int rowPos;
int colPos;
char direction;
charArrayPtr* jumble;
string toHide;
string difficulty;
void fillArray();
void hideWord();
char randomDirection();
int randomNum(int);
charArrayPtr* buildArray() const;
};
#endif
和我的getJumble。它用于获取创建的实际单词搜索。返回一个副本而不是指针,因此无法对其进行修改。
charArrayPtr* JumblePuzzle::getJumble() const{
charArrayPtr* tempJumble = new char*[size];
for (int i = 0; i < size; ++i){
tempJumble[i] = new char[size];
}
for (int i = 0; i < size; i++){
for (int j = 0; j < size; j++){
tempJumble[i][j] = jumble[i][j];
}
}
return tempJumble;
}
最佳答案
您的代码有一个主要问题,那就是您无法在JumblePuzzle(string,string)构造函数中初始化“size”成员。
您还应该做其他事情:
1)创建一个单独的函数来销毁JumblePuzzle类中的2d数组。您似乎正在复制相同的循环以在多个位置执行此操作。如果您只是调用一个函数来完成这项工作,则无需这样做。
2)您的分配和复制构造函数并非异常安全。如果new []在创建副本期间引发异常,则原始对象的数据无效。换句话说,您已经破坏了数据,并且当您要创建另一个2d数组时,当new []说“oops”时,您已经破坏了原始数据并且无法将其取回。