你的代码不完整,我指出两个问题。
1.你的v初始化应该放到构造函数里或者init函数里,如果你放到成员变量初始化里,实际上是在额外的浪费内存空间,因为你在构造的时候先构造成员变量,你的row和col是不是相当于重新赋值,给v又要重新分配内存,这不是良好的编程习惯。
2.某个操作有浅拷贝或者对v进行了double free双重释放也是容易造成delete崩溃,所以如果发生浅拷贝导致v指向了其他内存,而这个内存在栈空间分配,那么他会随着栈空间被释放而释放,但你delete释放栈空间内存就有问题了,你只能释放堆内存。如果v浅拷贝指向其他堆内存,当这块堆内存释放后,你再在构造内存释放v就造成了double free了。
望采纳
一、所有new出来的内存,都需要使用delete释放,否则会导致内存泄露。但是,delete放在析构函数里不一定是合适的!!
二、你在析构函数中delete释放内存报错,是因为:
你的程序中有代码调用了拷贝构造函数,而你的代码中没有实现拷贝构造函数,系统会调用默认的拷贝构造函数
默认的拷贝构造函数,是浅拷贝!!!例如:
DoubleSubscriptedArray a;
DoubleSubscriptedArray b=a; //调用拷贝构造函数,没有代码实现,会调用系统默认的拷贝构造函数
浅拷贝实现的过程是: b.v = a.v; 也就是b.v没有使用new重新申请内存,而是直接让b.v指向了a.v所在的地址。
这时候,如果代码运行中 超出了 a 作用域,a被系统回收,系统会自动调用a的析构函数使用delete释放掉v的内存。
但是这时候b.v仍然指向这块内存,在代码超出b的作用域后,也会调用b的析构函数来释放空间,
这就导致v指向的这块内存会被重复释放!!!!这也是导致崩溃的原因。
所以,并不是所有的delete放在析构函数中都是合适的!!
你可以写一个release()函数,把delete部分放在这个函数里,
你在代码中选择合适的地方调用release()函数来主观控制内存的释放。
new需要delete的。具体要看你的代码,可能有三种原因,一是new并没有执行,所以析构进行delete就报错;二是代码过程中修改了new指针的地址,指向了一个不需要delete的空间;三是你进行了类对象复制,导致两个类对象共享了同一份指针,那么各自析构时,后一个析构就会报错,因为前一个对象析构时,已经delete了
C++中是否需要delete一个指针,取决于它是否使用new分配了空间。如果是的话,就需要在不再使用时用delete释放空间,否则会造成内存泄漏。如果不是的话,就不需要delete,因为系统会自动回收局部变量的内存。如果你在类中定义了一个指针成员变量,并且在构造函数中用new为它分配了空间,那么你应该在析构函数中用delete释放它,以避免资源泄漏。如果你在析构函数中delete了一个没有用new分配的指针,可能会导致运行时错误或未定义行为。
该回答引用ChatGPTc++
#include
using namespace std;
class MyClass {
public:
MyClass() {
arr = new int[10];
for(int i = 0; i < 10; i++) {
arr[i] = i;
}
}
~MyClass() {
delete[] arr;
}
private:
int *arr;
};
int main() {
MyClass m;
return 0;
}
大致看了下截出来的代码,有很多函数没有用 引用传参&, 这样很容易出现对象的
浅拷贝,出现内存错误。当对象销毁调用析构函数就会出错了。
比如,你的operate == 这个函数没有用引用传参,中间会产生一个临时对象,这个
临时对象是直接复制了传过去的对象,是个内存浅拷贝,在析构的时候很可能内存出错