2012-09-07 117 views
25

我一直在尋找通過,並在Visual Studio中的C++ 11種不同的功能發揮,特別是2010年垃圾收集C++ 11

一個提到的一件事是minimal garbage collection

根據這個blog post,VC10支持這個功能。

我的測試表明,析構函數不叫上丟失的對象,所以我不知道以他們的記憶位置是否已被釋放,或者如果他們被泄漏。

我無意以任何方式依賴它,但無法找到關於其行爲的直接明確答案。

回答

36

最小GC支持(n2670)僅意味着包含了像std::declare_reachable這樣的函數,並且定義了「安全派生指針」的含義,因此使某些操作(如異或指針值)變爲未定義行爲,GC不必擔心。另見Bjarne Stroustrup's C++11 FAQ on the GC ABIn2585: Minimal Support for Garbage Collection and Reachability-Based Leak Detection

該提議允許GC在C++ 11的框架內實現。但是提案本身並不意味着實施需要支持GC。某些庫例如libC++只是將庫函數實現爲no-op。

我敢肯定,在這一點上,你的情況下的內存只是泄露了。但請注意,GC發生時確實不需要析構函數。假設「§3.8對象生存期」還提供給GC-ED指針,我們有(§3.8/ 4):

...對於一類類型的對象,具有一個非平凡的析構函數,程序不需要在對象佔用的存儲被重新使用或釋放​​之前明確調用析構函數;但是,如果沒有顯式調用析構函數或者沒有使用delete-expression(5.3.5)釋放存儲,則不應該隱式調用析構函數,並且任何依賴析構函數產生的副作用的程序有未定義的行爲。

所以也有可能內存已經被釋放而沒有被調用的析構函數。事實上,早期的GC等建議n2310: Transparent Programmer-Directed Garbage Collection for C++明確指出(N2310§7)

當一個對象被垃圾收集器回收,它的析構函數沒有被調用(中 當然,顯式刪除總是調用析構函數)。

+0

感謝您的回答! –

+0

據我瞭解,3.8/4是一節討論「程序」,不需要調用析構函數。換句話說,我們不需要說'foo->〜MyClass();刪除foo;'。在GC情況下,假定GC運行就像使用'delete'表達式是合理的 - 在這種情況下,GC負責調用析構函數。 – Eponymous