为什么C++ 11允许GC?

Tho*_*ing 4 c++ garbage-collection c++11

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))
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 5

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

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

参见Sutter's Mill:Garbage Collection Synopsis和C++

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

通过"引用计数",Sutter指的是std::shared_ptr类似的东西.