通常通常情况下,delete操作符不应该用于删除this指针。但是,一旦使用了delete this, 则需要考虑到下面的这些情况。
1) delete操作符只允许与使用new分配的对象配套使用
如果对象是用new创建的,则可以使用delete this, 否则会导致未知的行为。具体可参考本人之前的这篇文章。
class A
{
public:
void fun()
{
delete this;
}
};
int main()
{
//下面的3行是正常的
A *ptr = new A;
ptr->fun();
ptr = NULL // 避免野指针
//下面的2行会导致异常
A a;
a.fun();
return 0;
}
2) 一旦this指针被delete, 则这个对象的任何成员都不能再被访问
#include<iostream>
class A
{
int x;
public:
A() { x = 11;}
void fun()
{
delete this;
//下面这行可能会导致异常
std::cout<<x;
}
};
int main()
{
A a;
a.fun();
}
在程序设计中,尽量不使用delete删除this指针,可以采用其它方式来释放资源。
3) 静态成员的访问不受this影响
因为静态成员不需要特定对象来访问,所以即使this指针被删除后,类中的静态成员任然可以正常访问。
见下面例子:
#include<iostream>
class Test
{
public:
void func()
{
delete this;
}
static int a;
};
int Test::a = 11;
int main()
{
Test *obj = new Test;
obj->func();
std::cout<<"a = "<<Test::a;
return 0;
}
编译正常,输出:
a = 11