思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢?
#include <iostream> using namespace std; class A{ public: A(){ cout<<"A()"<<endl; } ~A(){ cout<<"~A()"<<endl; delete this; } }; int main() { A a; return 0; }
解析:delete p 是一个两步的过程:调用析构函数,然后释放内存(类本身占的内存)。
析构函数中调用delete this:上面这段程序的delete this会先调用~A()函数,然后再释放空间,这样每次调用delete都会调用~A(),而~A()又要调用delete,他们相互调用,就会形成死循环,造成堆栈溢出。
在成员函数中调用delete this:首先会调用类的析构函数,this指针已删除,会出现指针错误。
总结:
在成员函数中调用delete this,会导致指针错误,而在析构函数中调用delete this,出导致死循环,造成堆栈溢出。