2013-05-29 23 views
3

現在我正在學習boehm gc C++接口。不用它,只是好奇而已。我遵循官方的例子,寫我的類什麼可以GCed,在析構函數,有一個輸出,所以我可以告訴一個實例是否GCed或不。 但是,只有當我使用一個循環來創建多達千位或更多的實例才能觸發gc集合時。如果代碼是這樣簡單:如何在程序退出前強制boehm gc收集所有內容

class test_gc : public gc 
{ 
public: 
    ~test_gc() 
    { 
     cout << "~test_gc()" << endl; 
    } 
}; 

int main() 
{ 
    GC_INIT(); 
    ::new (GC) test_gc(); 
    GC_gcollect(); 
    return 0; 
} 

它似乎是從來沒有調用析構函數。沒有「〜test_gc()」輸出。此外,關閉了編譯器的優化。 我做了一些谷歌,幾乎找不到官方的例子。

請幫助我如何在程序退出前強制執行gc集合,或者如果我錯誤地使用它,請告訴我如何正確使用它。 非常感謝。

+0

我能找到一些所謂的「輸出」的情況是由gc_cleanup做出的。 –

回答

2

我做了一些谷歌,幾乎找不到官方的例子。

This Dr.Dobb's article on The Boehm Collector for C and C++ has some examples。

它似乎是從來沒有調用析構函數。

引述的文章:

但如果你想在析構函數被調用,你必須自己刪除的對象。

+1

非常感謝。我明白了,所以gc只處理內存,而不是數據,甚至不是析構函數。另外gc不能保證每個實例的收集順序。 –

0

從文章@沙菲克的鏈接:

如果您需要析構函數一類新的貝姆收集器會自動調用,您可以繼承貝姆收藏家的類gc_cleanup。它就像gc類一樣,只是它在安排回收實例的內存之前安排Boehm收集器立即調用析構函數。請記住,您不能保證所有實例都將被回收。

0

的問題是,貝姆的收集器是保守的 - 它不知道什麼樣的價值觀是活的指針和什麼樣的價值觀都沒有,所以它掃描可能是活的,並把它當作好像它是一切。在你的情況下,因爲你剛剛在GC_collect之前調用了new,所以它可能有一個指向寄存器或堆棧某處的對象的指針,這會使收集器認爲它仍然存在。嘗試把new一些來自main調用的其他功能,所以它的框架將被彈出調用GC_collect前:

int func() 
{ 
    ::new (GC) test_gc(); 
    return 0; /* overwrite the return value register so it doesn't contain the return value from ::new */ 
} 
int main() 
{ 
    GC_INIT(); 
    func(); 
    GC_gcollect(); 
    return 0; 
} 

這使得它更可能也不會有野指針在某處存儲對象,但也有沒有保證人。

+0

這是有道理的。謝謝。 –

相關問題