簡體   English   中英

C ++ - 析構函數的調用次數比預期的多

[英]C++ - Destructor is called more times than expected

考慮以下代碼:

class C1
{   public:

        C1(){ cout<<"CONSTR WAS HERE"<<endl; }

        C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }

        ~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}

void f1(C1 x){  }

int main()
{
    C1 c1;
    f1(c1);
}

如果我們按原樣運行代碼,我們得到:

CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE

從我的觀點來看,這是完全可以理解的。 但是,如果我們將函數“f1”修改為:

C1 f1(C1 x){}

代替

void f1(C1 x){}

我們得到:

CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE

我不太清楚為什么

啟用警告:

警告:函數中沒有return語句返回非void [-Wreturn-type]

您的程序中有未定義的行為 ,這意味着任何事情都可能發生。 編譯器很可能“在這里返回一個未定義的C1實例”,這會導致析構函數被調用。

程序可能會崩潰或執行任何其他操作,具體取決於您的編譯器/標志/機器。

修改C1 f1(C1 x){}實際返回一些內容,輸出將按預期進行( 演示

C1 f1(C1 x){ return {};}

CONSTR就在這里
COPY CONSTR就在這里
CONSTR就在這里
DESTR就在這里
DESTR就在這里
DESTR就在這里

否則您的代碼會顯示未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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