看前须知
本人c++新手,欢迎大佬讨论qwq(同时放几个大佬的文章链接在这,希望可以帮到你)
delete出错原因_数据太多 delete 失败-优快云博客
执行断点指令(__debugbreak()语句或类似调用),delete失败,空间释放问题。-优快云博客
引言
今日学习c++的类的时候在类中声明了个指针,并把动态创建一个数组给它,
用脚都知道动态创建的对象还是变量都到最后得delete释放一下,
然后高高兴兴地在析构函数里写上delete[] arr,主动释放下内存,
结果你猜这么着,戳啦,那错的就是一个地道,报出个断点什么
\
*之后尝试将delete注释掉,确实不出现断点了,但明显这是一个治标不治本的方法*
干货
对于这种情况,有几种原因:
1.对一块已释放的内存又释放一次
2.对动态创建的数组变量使用的是delete,而不是delete[]
3.对一块静态创建的变量进行delete(我是sb)
经过我的一顿排查,发现我的问题不是在析构函数中执行了delete[] arr,
而是函数结束的时候系统释放栈对象时,由于栈对象与外对象的arr指向的地址一致,
相当于也把外对象的arr指向的内存释放了,那么当外对象释放时,就会因情况1而出现断点
查资料的过程中,我也疑惑过:"我动态创建一个对象,同时对象内也有个动态创建的变量,那我应该如何释放?",
最笨的方法就是先手动释放对象内动态创建的变量,在释放对象:
delete obj.arr;
delete obj;
但是有个疑问:"如果该类内变量又是私有的,又该怎么释放它呢?"
之后我查到:"delete一个对象时,会调用该对象的析构函数,然后再将内存还给系统",
所以可以将"delete obj.arr;"写到析构函数里,这样直接delete obj也可以保证arr被释放:
class test
{
private:
int* arr;
public:
~test()
{
delete[] arr;//将成员的释放放到析构函数里
}
...
}
...
int main()
{
test* obj=new test;
...
delete obj; //delete obj时同时也将arr给释放掉了
...
}
当然了在析构函数里写了"delete obj.arr;",就不要手动"delete obj.arr;",这样又是情况1了