2012-12-27 125 views
4

C++ 11允許其實現執行(某些)垃圾收集實用程序。爲什麼標準允許這樣做?我總是有這樣的印象:在C++中,你不會爲你不使用的東西付費。對我來說,(隱含的)GC感覺就像破壞了這個意識形態。此外,通過智能指針在C++中編寫和使用顯式垃圾回收實用程序並不困難。爲什麼C++ 11允許GC?

其次,GC會使一些有效的程序無效。例子包括指針掩碼和相關的低級指針「黑客」。

int * nums = new int[10]; 
nums += 2; 
*nums = 777; // nothing points to the new'ed int[10] at this point 
// oh no! nums could have gotten collected!!! (so lets assume it was) 
*nums = 666; // crash (or memory corruption (or something else that's bad)) 
+0

如果垃圾收集器獲得釋放用於'Foo'對象的內存的選項,那並不意味着它必須先調用'Foo'的析構函數。 – hvd

+0

@ hvd:對。我已更新我的問題 –

+0

語言不支持指針掩碼和其他此類「低級指針黑客」;這些都是依賴於實現的。 –

回答

5

的GC不需要由C++ 11標準的存在,但它可能是在未來的版本中。

它不會被強制執行 - 只有在您提出請求時纔會執行。它不會收集你的正常指針,它不會收集當前的智能指針。所以,它仍然是'不要使用 - 不要付錢'。它只會在你明確要求的指針上工作,所以你的例子仍然可以像現在一樣工作。

參見Sutter’s Mill: Garbage Collection Synopsis, and C++

引用計數(#1)通常是最好的,這是GC的C++的默認 形式。但也有原因(不是反而)要懶惰的 C++中的標記清除(#2)垃圾回收處理事情參考 計數無法處理,包括當潛在的週期是 不可避免的(在某些情況下某些對象可能自然會被共享,然後可能互相引用)和無鎖ABA問題。

通過「引用計數」,Sutter引用std::shared_ptr和類似的東西。