我对下面这段代码感到很困惑。
#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告诉我这个没有问题,但我仍感到困惑。
答案 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工作代码。