【C/C++】析构函数中delete this 指针为什么会导致死循环
在析构函数中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;
}
这段代码会导致死循环,为什么呢?
(1) 首先,了解一下this指针
当一个对象声明时,系统会为这个对象分配一块内存空间,this指针指向这块内存空间,这块空间里面存着对象的数据成员和虚函数表指针。
(2) 当使用delete的时候
第一步,针对此内存会有一个(或更多)析构函数被调用
第二步,才会释放该内存
在析构函数中调用delete this: 上面这段程序的delete this会先调用 ~ A() 函数,然后再释放空间,这样每次调用delete都会调用~ A(),而~ A() 又要调用delete,他们相互调用,就会形成死循环。
在成员函数中调用delete this: 首先会调用类的析构函数,this指针已删除,会出现指针错误。
总结:
在成员函数中调用delete this,会导致指针错误,而在析构函数中调用delete this,出导致死循环,造成堆栈溢出。
本文探讨了在C/C++中析构函数内使用delete this指针导致的死循环问题。析构函数调用delete this会触发析构函数的无限递归,最终引发堆栈溢出。同时,成员函数中使用delete this可能导致指针错误。总结来说,应避免在析构函数中使用delete this以防止这类问题的发生。

1439

被折叠的 条评论
为什么被折叠?



