堆上2d数组的内存泄漏



我创建的一个类有很多内存泄漏的问题。这个任务要求在堆上创建一个单词搜索谜题。我已经创建了析构函数、复制构造函数和重载赋值操作符。

我认为这些函数中的一个一定有问题,因为确保它工作的最后检查是在循环中创建对象,看看它是否失败并且我的函数正在崩溃。我尝试过不同形式的析构函数,也尝试过改变复制和赋值操作符,但都没有成功。有点不知所措,缺乏警告确实使调试变得困难,如果没有对堆的正确理解。

任何帮助都将非常感激!

下面是一些使用堆的函数。

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[]说"哎呀"时,你已经销毁了原始数据并且无法恢复。

相关内容

  • 没有找到相关文章

最新更新