2012-12-27 81 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和类似的东西。