簡體   English   中英

析構函數和構造函數調用,示例對嗎?

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

但是我不能完全遵循。 我認為這就是發生的事情:

  1. 在主constructor中為RVO rvo;
  2. 在 MyMethod constructor中為RVO rvo;
  3. return (rvo); copyconstructor被稱為
  4. 在 MyMethod 中為本地 RVO 調用destructor
  5. 在 Main 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.

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