c++类中new的数组不需要delete吗?为什么写出析构函数然后delete会出现runtime error,不写delete反而不报错

img

img


c++类中new的数组不需要delete吗?为什么写出析构函数然后delete会出现runtime error,不写delete反而不报错

你的代码不完整,我指出两个问题。
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分配的指针,可能会导致运行时错误或未定义行为。

该回答引用ChatGPT
在C++中,使用 new 定义的内存空间一定要使用 delete 来释放,否则就会产生内存泄漏。

对于用 new 创建的数组,需要用 delete[] 来释放。在类中,如果在构造函数中用 new 来创建数组,在析构函数中就需要用 delete[] 来释放。

下面是一个示例代码:

c++
#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;
}


在这个示例中,我们在 MyClass 的构造函数中使用 new 来创建了一个大小为 10 的 int 数组,并在析构函数中使用 delete[] 来释放这个数组。

如果我们不写析构函数,编译和运行都是不会出现问题的,但是会导致内存泄漏。

如果我们写了析构函数但没有调用 delete[],则程序运行时仍会出现内存泄漏。

而如果我们写了析构函数并调用了 delete[],但在类中再次调用 delete[] 就会产生运行时错误。这是因为在程序退出时,析构函数会被自动调用,而第二个 delete[] 会尝试释放已经被释放的空间,从而导致错误。

综上所述,要保证程序的正常运行和避免内存泄漏,我们需要在类中正确使用 new 和 delete[],并在析构函数中释放内存空间。

大致看了下截出来的代码,有很多函数没有用 引用传参&, 这样很容易出现对象的
浅拷贝,出现内存错误。当对象销毁调用析构函数就会出错了。
比如,你的operate == 这个函数没有用引用传参,中间会产生一个临时对象,这个
临时对象是直接复制了传过去的对象,是个内存浅拷贝,在析构的时候很可能内存出错

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^