4

C++11 允许其实现执行(一些)垃圾收集实用程序。为什么标准会允许这样做?我一直认为,在 C++ 中,不用为不用的东西付费。对我来说,(隐式)GC 感觉就像它破坏了这种意识形态。此外,通过智能指针在 C++ 中编写和使用显式垃圾收集实用程序并不难。

其次,GC 会使一些原本有效的程序失效。示例包括指针屏蔽和相关的低级指针“hacks”。

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))
4

1 回答 1

5

C++11 标准并不要求 GC 存在,但它可能会出现在未来的版本中。

它不会对你强制执行——它只有在你请求时才会出现。它不会收集您的普通指针,也不会收集当前的智能指针。所以,它仍然是“不要使用——不要付费”。它仅适用于您明确要求它的指针,因此您的示例仍将像现在一样工作。

请参阅Sutter's Mill:垃圾收集概要和 C++

引用计数(#1)通常是最好的,它是 C++ 的默认 GC 形式。但是也有理由(而不是)希望 C++ 中的惰性标记扫描(#2)垃圾收集来处理引用计数无法处理的事情,包括当潜在的循环不可避免时(在某些情况下,某些对象可能自然而然地共享,但随后可能相互引用)和无锁 ABA 问题。

通过“引用计数”,萨特指的是std::shared_ptr和类似的东西。

于 2012-12-28T09:08:17.127 回答