【问题标题】:c++ overloading operator+ and dynamic memory allocationc++重载operator+和动态内存分配
【发布时间】:2014-02-19 03:44:37
【问题描述】:

我有一个任务要编写一个动态分配二维数组的类,然后我必须编写函数来处理它。其中一个函数是 operator+ 的重载函数。一切都按预期工作,即使是 operator+ 函数,直到程序调用析构函数。析构函数的工作很简单,就是释放之前分配的内存。我知道代码是正确的并且我已经手动测试过,但是当计算机在程序结束时调用此函数时,我得到“2DArray.exe 中 0x000566E1 处的未处理异常:0xC0000005:访问冲突读取位置 0xFEEEEF2。” 我尝试了各种各样的东西,我已经坐在这个问题上两天了,我已经筋疲力尽了。本周五到期。如果有人可以尝试并提供帮助,我将不胜感激。

这是我认为问题所在的两个函数。另外,请注意,当没有析构函数时,程序运行完全正常,但我必须确保在程序退出之前释放内存,这是它的一部分的任务。

 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;
    }
}

【问题讨论】:

  • 请同时显示构造函数和复制构造函数,以防万一出现问题。
  • 构造函数中的内存是如何分配的?还有,set_size() 是什么样子的?
  • 我没有复制构造函数。这可能是问题吗?
  • @glina126:是的。谷歌搜索“C++ 规则三”应该会得到很多信息。
  • 好的,非常好。我会阅读的。谢谢!

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


【解决方案1】:

看起来你需要一个拷贝构造函数。

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

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

第二个const 告诉编译器也将this 设为常量指针。

【讨论】:

  • 复制构造函数是这里的关键。另外,由于一些奇怪的原因,我的编译器对我做常量不满意。它将对象突出显示为语法错误。 object.Get_Elem(i, b) 给出这个错误:“const Square_Matrix &object Error: The object has type qualifiers are not compatible with member function object type is: const Square_Matrix”
【解决方案2】:

当您删除动态分配的数组中的所有值时,您将释放整个事物。

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

你必须删除该行

delete[] matrix;

它应该停止给出异常。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2015-06-27
    • 2021-02-28
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多