【C/C++】析构函数中delete this 指针为什么会导致死循环

本文探讨了在C/C++中析构函数内使用delete this指针导致的死循环问题。析构函数调用delete this会触发析构函数的无限递归,最终引发堆栈溢出。同时,成员函数中使用delete this可能导致指针错误。总结来说,应避免在析构函数中使用delete this以防止这类问题的发生。

【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,出导致死循环,造成堆栈溢出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值