delete this

delete p执行了哪些步骤?

delete p是一个两步的过程:调用析构函数(释放类里边涉及new的内存),然后释放内存(类本身占的内存)。

在对类指针使用delete this时,实际发生了两个步骤。
A:先是调用该类的析构函数,以做数据成员的释放工作,以及一些finish code,这一切由程序员自己定义。
B:然后再调用operator delete(void*)释放该对象实例的内存数据。这是一个对象在消亡之前的所做的最后动作。一般不要override这个函数,如果要,务必记住最后调用系统的::operator delete真正释放该对象所占用的内存。
一般来说,内存释放释放的只能是数据段的内容(包括堆和栈,但释放栈上的内存由系统进行),而代码段的内存,除一些病毒攻击等非正常强行改写手段外,在内存中是永远不会释放/改变的,直到程序结束,因此在内存释放后也是可以访问的。所以,一般所谓的释放内存delete操作,是在数据段进行的释放。
下面就是一个例子:

#include <iostream>
using namespace std;


class A 
{
public:
    A() { a = 10; b = 20; }
    int a;
    int b;
    void show() { cout << a << " " << b << endl; }
    void release() { delete this; }
};

int main()
{
    A *a = new A;
    a->show();      //10 20
    a->release();
    a->show();      //-572662307 -572662307
    return 0;
}

c++中如何安全的使用delete this?

1.确保对象是new出来的,不能是new[]出来的;
2.确保delete完后不会用该对象调用其它(非静态)成员函数;
3.确保delete完后不能访问对象的任何部分;
4.确保delete完后this指针不会被访问;
5.当指针是一个指向基类类型的指针,而没有虚析构函数时(也不可以delete this)。

上面所说的在执行时不一定会报错,但为了安全尽量不要这么做。

转载文章对象析构谈—— delete this 的使用及注意事项c++中如何安全的使用delete this?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值