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))
答案 0 :(得分:5)
C ++ 11标准不要求GC存在,但它可能在将来的版本中。
不会对你强制执行 - 只有在你提出要求时它才会存在。它不会收集你的正常指针,也不会收集当前的智能指针。所以,它仍然是'不使用 - 不为它付钱'。它只适用于您明确要求的指针,因此您的示例仍将像现在一样工作。
请参阅Sutter’s Mill: Garbage Collection Synopsis, and C++
引用计数(#1)通常是最好的,它是C ++的默认值 GC的形式。但也有理由(而不是)想要懒惰 用C ++标记清除(#2)垃圾收集来处理ref 计数无法处理,包括潜在的周期 不可避免的(在某些情况下,某些物体可能会自然地被共享, 但后来可能会互相提及)和无锁定的ABA问题。
通过“引用计数”,Sutter引用了std::shared_ptr
和类似的东西。