关于delete this

在类的成员函数中能不能使用delete this?

答:能!在某些设计模式中需要赋予对象自我销毁的能力,这个时候就可以使用delete this将该对象的this指针进行删除,但是需要确定的是不能在访问该对象的数据成员,或需要调用访问这些成员的函数,虽然还是可以访问,但数据已经是不安全的。

使用delete this的注意事项:
1.通常情况下delete this 往往是跟对象指针一起使用,确保对象占用的内存是在heap(堆)上,即该对象使用new生成, 因为delete 往往跟new是成对出现的。
2.delete this 之后,不能再访问this指针和该对象的数据成员变量和虚函数。

判断对象是否在堆上可以通过:
1)连续生成两个对象,如果第二个对象的地址大于第一个对象,即对象是在heap上。

简单的测试代码:

#include <iostream>
using namespace std;


class del_this{
public:
    static int int_is_heap;
    int val;
    int get_val()
    {
        return val;
    }
    void do_something()
    {
        cout<<"do something"<<endl;
    }
    void destroy() const
    {
        //如果要使用delete this 这条语句,必须保证对象是位于heap上的,即必须是new 一个对象
        delete this;
    }
    del_this():val(0)
    {

    }
private:
    ~del_this()
    {
    }

};
//typedef void (del_this::*p)();//这是一个类型


int main(int argc, const char * argv[]) {
    del_this *p_del_this=new del_this;
    del_this *p_del_this2=new del_this;

//    del_this d;
//    d.destroy();//在运行中直接报错

    cout<<"address_first_object: "<<p_del_this<<endl;

    cout<<"address_second_object: "<<p_del_this2<<endl;
    //address_first_object: 0x100500330
    //address_second_object: 0x100500340
    //可以看到第二个对象比第一个对象大,即new的对象都在堆上
    p_del_this->destroy();
    p_del_this->do_something();

}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值