簡體   English   中英

C ++構造函數/析構函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM