[英]Why does the number of constructor calls not match with the number of destructor calls?
我對以下代碼感到非常困惑。
#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告訴我這沒什么問題,但我仍然感到困惑。
您的代碼構造了兩個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
mobject dtor
兩行輸出是由於以下原因:
func1(giveme());
行的main
中調用giveme()
函數時,將創建第一個對象func1(giveme());
。 程序結束時,這將給出輸出mobject dtor
的第三行。 mobject g = p;
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;
}
輸出值
6. In Function: main
1. In Function: giveme
mobject ctor
4. In Function: func1
2. In Function: func2
mobject overridden-copy-constructor
3. In Function: func2
mobject dtor
5. In Function: func1
mobject dtor
7. In Function: main
看到這里工作代碼吧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.