为什么析构函数被调用三次?

时间:2013-11-12 06:03:06

标签: c++ constructor destructor

输入:

#include <iostream>
using namespace std;
class SimpleClass
{
    public:

    SimpleClass()
    {
        cout<<"SimpleClass Constructor\n";
    }
    virtual ~SimpleClass()
    {
        cout<<"SimpleClass destructor\n";
    }
};
int main()
{
    SimpleClass a;    
    SimpleClass lol = a;

    SimpleClass b;
    SimpleClass * lol2 = &b;
}

输出:

SimpleClass Constructor
SimpleClass Constructor
SimpleClass destructor
SimpleClass destructor
SimpleClass destructor

我很困惑为什么析构函数被调用了3次。

构造函数只被调用两次!!!!

7 个答案:

答案 0 :(得分:11)

对于alolb,析构函数被调用三次。
在您的情况下,ab使用default constructor进行实例化。但请注意lol使用copy constructor

进行实例化

答案 1 :(得分:6)

因为正好创建了3个SimpleClass类对象,但是你的构造函数只被调用了2次:

  • 第一个对象是a,调用你的构造函数;
  • 第二个是lol,通过 a 通过隐式定义的复制构造函数进行初始化(从而绕过构造函数);
  • 3rd is b,调用您的构造函数。

请注意,lol2只是指向b的指针,因此不会进行额外的调用。

正确的名称是“析构函数”,而不是“解构函数”;)

答案 2 :(得分:5)

您有3个对象alolb。您没有跟踪由编译器生成的复制构造函数(这个由lol调用),因此这就是为什么只有两个构造函数。

答案 3 :(得分:3)

alolb每次调用一次。

要确认这一点,您可以在类中添加一个字段,并为每个字段分配一个名称/ ID,您可以在析构函数中打印出来。您还可以打印出this的值,这是指向对象的指针。

答案 4 :(得分:2)

  SimpleClass lol = a;    //calls the default copy constructor which you have not defined

覆盖复制构造函数,然后您可能会看到一个名为。

的新构造函数

答案 5 :(得分:0)

您有alolb

也许你可以在main()以及构造函数和析构函数中打印他们的地址,然后你会看到它。

答案 6 :(得分:0)

因为析构函数对于所有对象都是相同的。