[英]c++ constructor / destructor
我有以下代碼:
#include <iostream>
using namespace std;
class A
{
public:
A ()
{
cout<<"cons"<<endl;
}
~A ()
{
cout<<"dest"<<endl;
}
};
A
gokul (void)
{
A p;
return p;
}
int
main ()
{
A a = gokul();
cout<<"done\n";
}
當我運行它時。 我得到以下輸出:
缺點
完成
dest
我期望的輸出是:
缺點-> p已創建,
缺點->對於,gokul返回
dest-> p被破壞,gokul返回
完成
dest->已毀,主返回
因為當gokul函數返回時,局部變量“ p”將被破壞,並且將創建新變量“ a”,不是嗎? 我已經用所有三個標准03、11和14進行了編譯,結果相同。 〜
您的代碼無法跟蹤副本構造函數。 您需要執行此操作以更好地了解創建對象的時間。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout<<"cons"<<endl; }
~A() { cout<<"dest"<<endl; }
A(const &A) { cout << "copy constructed" << endl;}
};
A gokul (void)
{
A p;
return p;
}
int main ()
{
A a = gokul();
cout<<"done\n";
}
當您在Visual Studio 2015中運行此代碼時,沒有進行任何優化,輸出如下:
cons
copy constructed
dest
done
dest
當您更改為發布模式時,輸出現在是這樣的:
cons
done
dest
第二個輸出不具有副本構造的原因是由於執行了Named Return Value Optimization
以刪除副本。
但是,關鍵是您真的無法預測復制構造函數被調用多少次。 如您所見,未優化的版本也可以正常工作。
如果您打開了優化功能,則由於編譯器優化而獲得了此輸出,請在此處 Copy Elision
輸入鏈接描述
或者,如果您在調試模式下運行程序(沒有優化),則不會簡單地跟蹤@PaulMcKenzie解釋的副本構造函數。
您可以嘗試在不進行優化的情況下進行編譯: /Od
(在Visual Studio中),- -O0
在gcc中。 或者只是在調試模式下運行。 然后通過/O2
或-O2
返回到優化版本。
請注意,如果您切換到非優化版本/0d
,但仍無法獲得輸出,則從C ++ 11編譯器可以使用move構造函數。 因此,您需要跟蹤move構造函數
A(const A&& o){
cout << "move ctor" << endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.