在类的成员函数中能不能使用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();
}