关于C/C++中的关键字delete

这个问题迷惑着我,我在CSDN上发帖子,得到了很好的解决。这是我第一次在CSDN上发帖子,CSDN果然是N多大牛.

先看代码:

class base { public: base() {p = this;cout<<"base()"<

问题是为什么执行delete这条语句会导致虚构函数无限递归?

 

 感谢网友Arcticanimal,他给出了明确的两点解释:

 1).  delete 操作符会被编译器展开为至少两个子过程

   1. 调用所传入类型的析构函数(如果是虚析构函数,之后还会去调用子类的析构函数)
   2. 调用内存销毁函数,释放所传入指针指向的内存

对非动态分配的对象调用delete,第一个过程是不会有问题的,但是第二个过程就会让你的程序挂掉
楼主的代码在析构函数中调用delete,会在第一个子过程中形成无限递归,不会执行到第二个子过程。所以楼主的代码会正常的无线递归。

 

 2). 伪代码清晰的解释了导致递归的原因

// class base 的析构函数会编译成如下形式 void base_destructor(T* ); // 这是delete 展开之后的伪代码 operator delete(base* p) { base_destructor(p); free(p); } // base 的析构函数实现 void base_destructor(T* p) { delete(p); } 

 

你可能感兴趣的:(C/C++)