析构函数给出我不明白的输出("./a.out"中的错误:双重释放或损坏(快速顶部):)

Destructor gives output I don't understand (Error in `./a.out': double free or corruption (fasttop):)

本文关键字:释放 顶部 损坏 错误 out 明白 输出 析构函数      更新时间:2023-10-16

我们被要求为矩阵编写一个类,到目前为止,我有以下内容:

代码

但是我们应该:"实现以下成员函数:参数化的构造函数(使用new)和析构函数(使用delete)"

我不太确定这是什么意思,但我想我已经做到了。问题是,当我取消第65行注释时,我得到了一个以前从未见过的奇怪的运行时错误。知道我哪里做错了吗?谢谢:)

编辑:谁否决了我的问题,为什么?

我还加上了:

        matrix(matrix &m) {
        // Copy size and declare new array
        mdata=0; size=(m.getcols()*m.getrows());
        if(size>0) {
            mdata=new double[size];
            // Copy values into new array
            for(int i=0;i<size;i++) {
                mdata[i] = m.mdata[i];
            }
        }
    }

delete [] mdata;

现在错误已经消失了,所以感谢Ilya Kobelevskiy和aruisdante的回答

您没有实现复制构造函数,因此当您从乘法函数按值返回时将调用默认构造函数

默认构造函数简单地按字节复制成员,因此最终得到两个包含指向相同内存块的mdata的矩阵。当调用第二个矩阵的析构函数时,它试图释放已经释放的内存,因此出现错误。

当然,再加上其他人指出的delete[]。

一般来说,你应该遵循三原则。适用于您的情况,这意味着如果您在析构函数中做任何重要的事情,您应该显式地实现赋值操作符和复制构造函数,或者将它们声明为私有而不实现它们,以避免编译器自动生成它们并使类不可复制。

mdata是一个数组,当你在析构函数中删除它时,需要添加[]:

delete [] mdata;

当您删除数组时,您需要使用delete[]操作符而不是delete操作符。请注意,通过delete删除数组实际上是未定义的行为,这恰好是你的特定代码组合和编译器似乎正在做的。