在同一个类的析构函数中调用类的构造函数

时间:2010-05-05 11:31:40

标签: c++ oop constructor g++ destructor

专家!!我知道这个问题是一个糟糕的问题,但我还是敢于​​敞开心扉,希望我能向所有人学习。

我尝试了一些例子作为我日常工作的一部分并做了这件可怕的事情,我从同一类的析构函数中调用了类的构造函数。

我真的不知道在实际编程中是否需要这个,我想不出任何我们真正需要在析构函数中调用函数/ CTOR的实时场景。通常,析构函数用于清理。

如果我的理解是正确的,为什么编译器不会抱怨?这是因为它有一些很好的理由吗?如果是这样,他们是什么?

我试过Sun Forte,g ++和VC ++编译器,但没有人抱怨它。\

编辑:我感谢大家的回答,我想我没有清楚地说明我的观点,我知道结果,它会以递归方式结束,程序可能会崩溃,但问题实际上是在析构函数允许的情况下创建一个对象。


using namespace std; class test{ public: test(){ cout<<"CTOR"<<endl; }

~test() {cout<<"DTOR"<<endl; test(); }};

5 个答案:

答案 0 :(得分:3)

以下运行时

test();

你构造一个临时(新)对象,当控件“通过分号”时会立即销毁它,调用该临时对象的析构函数,构造另一个临时对象等,这样你就会得到无尽的死亡螺旋递归调用导致堆栈溢出并导致程序崩溃。

禁止析构函数创建临时对象将是荒谬的 - 它会严重限制您使用的代码。它也没有意义 - 析构函数正在销毁当前的对象,而那些临时对象与它完全无关,因此强制执行这些约束是没有意义的。

答案 1 :(得分:1)

据我所知,你只是在析构函数中实例化新的test对象并保持原样。

答案 2 :(得分:1)

静态分析工具是应该抱怨的事情。对我来说,你的情况与以下情况没有什么不同:

void foo();
void bar()
{
   foo();
}
void foo()
{
   bar();
}

我不知道是否有任何编译器会抱怨上面的代码,但是这个例子比你的简单得多,而且还有很多其他编译器。

编辑: 在您的情况下,问题更简单。这是一个普通的无限递归,因为你的析构函数的想法有点像:

   ~test()
   {
      cout<<"DTOR"<<endl;
      test tmp();
      tmp.~test(); // infinite recursion.
   }

答案 3 :(得分:1)

这段代码给测试实例一个很大的尺寸,实际上会很快产生堆栈溢出,因为无限递归:

#include <iostream>
using namespace std;
class test{
   public:
    int a[10000];
    test(){
     }

~test() {
 test();
 }};

int main() {
    test t;
}

C ++不要求为无限递归发出警告,通常很难检测到。

答案 4 :(得分:0)

我认为没有理由为什么它应该是非法的,但我承认我正在努力想出一个很好的例子来说明为什么我会这样做。为了使其“有效”,你需要有条件地调用c'tor而不是无条件地调用它。