在 C++11's language feature list有:
Minimal support for garbage collection and reachability-based leak detection
(但它似乎在 GCC 和 Clang 中都没有实现。)
标准委员会为什么要引入这种垃圾回收 C++ 语言特性?
C++ 真的需要 GC 吗? RAII 不是这么优秀的模式吗(可以统一用于内存和非内存资源,如套接字、文件、纹理...)?
GC 会破坏使用 RAII 的 C++ 代码模式的一致性吗?
有人说 GC 可以很好地打破循环依赖关系,但是为了这个目的使用像 weak_ptr
这样的智能指针不是很好吗?
如果抛出异常会发生什么?如何修改堆栈展开语义以考虑 GC?
还会引入类似 C# 的 IDisposable
模式吗?
另外,假设C++中引入了GC,指针语法会不会不一样?例如我们会像在 C++/CLI 或 C++/CX 扩展中那样有一些类似帽子的“指针”^
吗?应该有一种方法可以区分普通的原始指针和“托管”指针,对吧?
最佳答案
该提案没有引入垃圾收集器 - 它只是在某些情况下允许它如果实现选择。该标准只会将这些情况描述为导致未定义的行为。这样做,它放宽了实现的要求,为垃圾收集器提供了最小的余地。
the proposal 中给出的简单示例考虑当你把一个指针指向一个动态分配的对象时,将它与另一个值进行异或,从而隐藏指针值,然后恢复原始指针值以通过它访问对象。在 C++11 之前,这将非常好,并且仍然可以使用。然而,现在这样的操作可能(见下一段)被认为是未定义的行为,这意味着实现可能对指向的对象进行垃圾收集。
标准规定实现可以具有宽松的指针安全,在这种情况下,行为与以前一样,或者严格的指针安全,它允许引入垃圾收集器。
An implementation may have relaxed pointer safety, in which case the validity of a pointer value does not depend on whether it is a safely-derived pointer value. Alternatively, an implementation may have strict pointer safety, in which case a pointer value that is not a safely-derived pointer value is an invalid pointer value unless the referenced complete object is of dynamic storage duration and has previously been declared reachable (20.6.4). [...] It is implementation defined whether an implementation has relaxed or strict pointer safety.
如果指针值指向动态分配的对象并且没有发生任何有趣的事情(在第 3.7.4.3 节中更具体地定义),则指针值是安全派生的指针值。
如果您的实现具有严格的指针安全性,但您仍想对指针做一些有趣的事情而不引入未定义的行为,您可以声明一个指针 p
像这样可以到达:
declare_reachable(p);
此函数在 <memory>
中定义 header ,以及相关函数,例如 undeclare_reachable
, declare_no_pointers
, 和 undeclare_no_pointers
.您还可以使用 get_pointer_safety
来确定实现的严格性。 .
关于C++11 垃圾收集器 - 为什么和如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15157591/