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

mec*_*ahi 0 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;
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出:

mobject ctor
mobject dtor
mobject dtor

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

Mic*_*ann 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;
}
Run Code Online (Sandbox Code Playgroud)

这使:

mobject ctor
mobject copy-ctor
mobject dtor
mobject dtor