为什么构造函数调用的数量与析构函数调用的数量不匹配?

时间:2017-12-08 08:09:26

标签: c++

我对下面这段代码感到很困惑。

#include <iostream>

class mobject
{
public:
    mobject(){ std::cout << "mobject ctor\n"; }
    ~mobject(){ std::cout << "mobject dtor\n"; }
};

mobject giveme() { return mobject(); }
void func2(const mobject& p) { mobject g = p; }
void func1(const mobject& p) { func2(p); }
int main()
{
    func1(giveme());
    return 0;
}

它给了我以下输出:

mobject ctor
mobject dtor
mobject dtor

我用gcc 5.4.0和`“g ++ -g temp.cpp”编译了代码。我主要担心的是第二个调用mobjects的析构函数。这看起来是错误的,因为我们第二次打电话给dtor。 valgrind告诉我这个没有问题,但我仍感到困惑。

2 个答案:

答案 0 :(得分:10)

您的代码构造了两个mobjects,一个默认构造而另一个构造,但您只在默认构造函数中放置了一条打印消息,并忽略了复制构造函数。另请注意,您的函数调用与手头的问题无关:

#include <iostream>

struct mobject
{
    mobject(const mobject& /* other */){ std::cout << "mobject copy-ctor\n"; }
    mobject(){ std::cout << "mobject ctor\n"; }
    ~mobject(){ std::cout << "mobject dtor\n"; }
};

int main()
{
  const mobject& p = mobject();
  mobject g = p;
}

给出:

mobject ctor
mobject copy-ctor
mobject dtor
mobject dtor

答案 1 :(得分:1)

mobject dtor的两行输出结果如下:

  • 当您在行giveme()的{​​{1}}中调用main函数时,会创建第一个对象。当程序结束时,这将给出第3行输出func1(giveme());
  • 使用函数mobject dtor的行default-copy-constructor中的mobject g = p;创建第二个对象。第二行输出func2是从该函数返回此对象的时间。

遵循修改后的代码和相应的输出将证明它:

mobject dtor

<强>输出

class mobject
{
public:
    mobject(const mobject& ob){ cout << "mobject overridden-copy-constructor\n"; }
    mobject(){ cout << "mobject ctor\n"; }
    ~mobject(){ cout << "mobject dtor\n"; }
};

mobject giveme() 
{ 
    cout << "1. In Function: "<<__func__<<endl;
    return mobject(); 
}
void func2(const mobject& p) 
{ 
    cout << "2. In Function: "<<__func__<<endl;
    mobject g = p; 
    cout << "3. In Function: "<<__func__<<endl;
}
void func1(const mobject& p) 
{ 
    cout << "4. In Function: "<<__func__<<endl;
    func2(p); 
    cout << "5. In Function: "<<__func__<<endl;
}
int main()
{
    cout << "6. In Function: "<<__func__<<endl;
    func1(giveme());
    cout << "7. In Function: "<<__func__<<endl;
    return 0;
}

请参阅here工作代码。