輸出

2010-04-21 46 views
3

如果我傾倒通過GCC爲虛析構函數生成的(與-fdump樹原創)的代碼,我得到的是這樣的:輸出

;; Function virtual Foo::~Foo() (null) 
;; enabled by -tree-original 

{ 
    <<cleanup_point <<< Unknown tree: expr_stmt 
    (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo + 8) >>> 
>>; 
} 
<D.20148>:; 
if ((bool) (__in_chrg & 1)) 
    { 
    <<cleanup_point <<< Unknown tree: expr_stmt 
    operator delete ((void *) this) >>> 
>>; 
    } 

我的問題是:「<D.20148>:;」後面的代碼在哪裏?它在析構函數之外,所以這段代碼何時執行?

回答

3

看起來像編譯器生成的代碼來調用析構函數後管理實際的內存釋放,並且應該在析構函數代碼後執行。

+0

查看程序集輸出後,看起來你是對的。但是你知道爲什麼代碼在析構函數之外顯示,標籤是什麼意思? – Job 2010-04-25 17:18:59

+0

編譯器向您顯示與您所寫的代碼相對應的生成內容。該標籤之後的代碼是自動生成的,實際上是由delete調用引發的,而不是你的析構函數。即使它在析構函數之後被調用,它也不是析構函數代碼的一部分。我不知道標籤的含義。 – 2010-04-26 03:31:44