析构函数给出我不明白的输出("./a.out"中的错误:双重释放或损坏(快速顶部):)
Destructor gives output I don't understand (Error in `./a.out': double free or corruption (fasttop):)
我们被要求为矩阵编写一个类,到目前为止,我有以下内容:
代码但是我们应该:"实现以下成员函数:参数化的构造函数(使用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
删除数组实际上是未定义的行为,这恰好是你的特定代码组合和编译器似乎正在做的。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 程序顶部的声明与定义(最佳实践)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 双重释放或损坏(快速顶部).我该如何解决?
- OpenMP *** "..."中的错误:双重释放或损坏(快速顶部):[地址] ***
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- C++矢量push_back双重释放或损坏(快速顶部)
- 析构函数给出我不明白的输出("./a.out"中的错误:双重释放或损坏(快速顶部):)