VS中因为delete而导致执行断点指令

看前须知

 本人c++新手,欢迎大佬讨论qwq(同时放几个大佬的文章链接在这,希望可以帮到你)

delete出错原因_数据太多 delete 失败-CSDN博客

执行断点指令(__debugbreak()语句或类似调用),delete失败,空间释放问题。-CSDN博客

引言

        今日学习c++的类的时候在类中声明了个指针,并把动态创建一个数组给它,

        用脚都知道动态创建的对象还是变量都到最后得delete释放一下,

        然后高高兴兴地在析构函数里写上delete[] arr,主动释放下内存,

b175210e3fc84cccb59f31fc5779b136.png

        结果你猜这么着,戳啦,那错的就是一个地道,报出个断点什么

9182d26ff06c45ecb29a0ce02351359c.png\

*之后尝试将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了

 

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值