c ++重载operator +和动态内存分配

时间:2014-02-19 03:44:37

标签: c++ memory-management memory-leaks operators operator-overloading

我有一个编写动态分配2D数组的类的赋值,然后我必须编写函数来处理它。其中一个功能是operator +的过载功能。一切都按预期工作,甚至是操作符+函数,直到程序调用析构函数。析构函数具有释放先前分配的内存的简单任务。我知道代码是正确的,我已经手动测试了,但是当计算机在程序结束时调用此函数时,我得到“2DArray.exe中的0x000566E1处的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEF2。” 我尝试了各种各样的事情,我已经在这个问题上待了两天了,我已经筋疲力尽了。它本周五到期。如果有人可以尝试和帮助,我将不胜感激。

以下是我认为问题所在的两个函数。另外,请注意,当没有析构函数时,程序运行完全正常,但我必须确保在程序退出之前释放内存,其中作业。

 Square_Matrix Square_Matrix::operator+(Square_Matrix & object)
{
    Square_Matrix sum;
    sum.Set_Size(size);
    for (int i = 0; i < size; i++)
    {
        for (int b = 0; b < size; b++)
        {
            sum.Set_Elem((matrix[i][b] + object.Get_Elem(i, b)),i, b);
        }
    }
    return sum;
}

Square_Matrix::~Square_Matrix()
{
    // destructor
    // release the allocated memory

    if (size > 0)
    {
        for (int d = 0; d < size; d++)
        {
            delete[] matrix[d];
        }
        delete[] matrix;

        size = 0;
    }
}

2 个答案:

答案 0 :(得分:1)

看起来你需要一个复制构造函数。

此外,您对operator +的参数应为const Square_Matrix &object。你没有任何改变第二个对象的意图,对吗?告诉编译器。它会很感激。

事实上,你没有任何改变第一个对象的意图,所以你应该声明它Square_Matrix Square_Matrix::operator+(const Square_Matrix & object) const

第二个const告诉编译器也使this成为一个const指针。

答案 1 :(得分:0)

当您删除动态分配的数组中的所有值时,您将取消分配整个内容。

for (int d = 0; d < size; d++)
{
    delete[] matrix[d];
}

您必须删除该行

delete[] matrix;

它应该停止给出例外。