为什么c++ 11允许GC ?

Why does C++11 allow for GC?

本文关键字:GC 允许 c++ 为什么      更新时间:2023-10-16

c++ 11允许其实现执行(一些)垃圾收集实用程序。为什么标准会允许这样呢?我一直有这样的印象:在c++中,不用为不用的东西付费。对我来说,(隐含的)GC似乎破坏了这种意识形态。此外,在c++中通过智能指针编写和使用显式垃圾收集实用程序并不困难。

第二,GC会使一些原本有效的程序无效。示例包括指针屏蔽和相关的低级指针"hack"。

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

GC在c++ 11标准中不需要存在,但在未来的版本中可能会存在。

它不会被强加于你——它只会在你请求的时候出现。它不会收集你的普通指针,它不会收集当前的智能指针。所以,它仍然是"不要使用-不要为它付费"。它将只对你显式要求的指针工作,所以你的例子仍然会像现在一样工作。

参见Sutter 's Mill: Garbage Collection简介和c++

引用计数(#1)通常是最好的,它是c++的默认值GC的形式。但也有理由(而不是取而代之)想要懒惰标记-清除(#2)垃圾收集在c++中处理的东西计数无法处理,包括潜在循环的时间不可避免的(在某些情况下,某些对象可能会自然地被共享,但随后可能相互引用)和无锁ABA问题。

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