为什么C ++ 11允许GC?

时间:2012-12-27 23:54:34

标签: c++ c++11 garbage-collection

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

1 个答案:

答案 0 :(得分:5)

C ++ 11标准不要求GC存在,但它可能在将来的版本中。

不会对你强制执行 - 只有在你提出要求时它才会存在。它不会收集你的正常指针,也不会收集当前的智能指针。所以,它仍然是'不使用 - 不为它付钱'。它只适用于您明确要求的指针,因此您的示例仍将像现在一样工作。

请参阅Sutter’s Mill: Garbage Collection Synopsis, and C++

  

引用计数(#1)通常是最好的,它是C ++的默认值   GC的形式。但也有理由(而不是)想要懒惰   用C ++标记清除(#2)垃圾收集来处理ref   计数无法处理,包括潜在的周期   不可避免的(在某些情况下,某些物体可能会自然地被共享,   但后来可能会互相提及)和无锁定的ABA问题。

通过“引用计数”,Sutter引用了std::shared_ptr和类似的东西。