我创建的一个类有很多内存泄漏的问题。这个任务要求在堆上创建一个单词搜索谜题。我已经创建了析构函数、复制构造函数和重载赋值操作符。
我认为这些函数中的一个一定有问题,因为确保它工作的最后检查是在循环中创建对象,看看它是否失败并且我的函数正在崩溃。我尝试过不同形式的析构函数,也尝试过改变复制和赋值操作符,但都没有成功。有点不知所措,缺乏警告确实使调试变得困难,如果没有对堆的正确理解。
任何帮助都将非常感激!
下面是一些使用堆的函数。
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[]说"哎呀"时,你已经销毁了原始数据并且无法恢复。