[英]Destructor and Constructor calls, Example right?
我不得不提高我對調用構造函數的情況的理解。 在此期間,我偶然發現了微軟的這個例子:
//RVO class is defined above in figure 4
#include <stdio.h>
RVO MyMethod (int i)
{
RVO rvo;
rvo.mem_var = i;
throw "I am throwing an exception!";
return (rvo);
}
int main()
{
RVO rvo;
try
{
rvo=MyMethod(5);
}
catch (char* str)
{
printf ("I caught the exception\n");
}
}
RVO
類在調用時只具有構造函數、復制構造函數和析構函數打印。 微軟表示,在 thorw 注釋掉並且沒有 NRVO 的情況下,輸出將是:
I am in constructor
I am in constructor
I am in copy constructor
I am in destructor
I am in destructor
I am in destructor
但是我不能完全遵循。 我認為這就是發生的事情:
constructor
中為RVO rvo;
constructor
中為RVO rvo;
return (rvo);
copyconstructor
被稱為destructor
destructor
中調用本地 rvo 這給我留下了比微軟宣稱的更少的destructor
調用。 我錯過了什么?
為了完整起見, RVO
類:
class RVO
{
public:
RVO(){printf("I am in constructor\n");}
RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
~RVO(){printf ("I am in destructor\n");}
int mem_var;
};
不要混淆。 在沒有返回值優化的情況下,創建了三個) 對象(包括用於通過復制構造函數復制的臨時對象),因此正在銷毀三個對象(包括再次臨時對象),所以一切都很好。
但是,使用 RVO,復制時不會創建臨時對象(對象將直接在調用者的堆棧幀中創建),並且您只會看到兩個構造和兩個銷毀。
如果你仔細看語句 rvo=MyMethod(5);
rvo 是由 MyMethod 的返回對象賦值的,返回對象應該在 main 函數的作用域內構造。 這個對象是未命名的,是一個臨時對象。 這樣一個對象的構造函數顯示在輸出中,乍一看並不明顯。
rvo 在 main() 中構造
rvo 在 MyMethod 中構建
未命名的 RVO 對象是通過 return 語句從 MyMethod 中的 rvo 復制構造的
所有三個對象都被銷毀
“在main構造函數中為RVO調用rvo;在MyMethod中為RVO調用構造函數rvo;為return(rvo);copyconstructor” 所以構造了三個對象,一般情況下應該有三個銷毀。 返回值也需要銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.