C++ C++;11垃圾收集器-为什么和如何

C++ C++;11垃圾收集器-为什么和如何,c++,c++11,garbage-collection,C++,C++11,Garbage Collection,其中包括: 对垃圾收集和基于可达性的泄漏的最小支持 检测 (但似乎在GCC和Clang中都没有实现。) 为什么标准委员会引入了垃圾收集C++语言特征? C++真的需要GC吗?RAII不是一个非常好的模式吗(它可以统一用于内存和非内存资源,如套接字、文件、纹理…) GC会破坏使用RAII/< P>的C++代码模式的均匀性吗? 有人说GC可以方便地打破循环依赖关系,但使用智能指针(如weak_ptr)来实现这一目的难道不好吗 如果抛出异常会发生什么情况?如何修改堆栈展开语义以考虑GC 是否还会引

其中包括:

对垃圾收集和基于可达性的泄漏的最小支持 检测

(但似乎在GCC和Clang中都没有实现。)

为什么标准委员会引入了垃圾收集C++语言特征? <> C++真的需要GC吗?RAII不是一个非常好的模式吗(它可以统一用于内存和非内存资源,如套接字、文件、纹理…)

GC会破坏使用RAII/< P>的C++代码模式的均匀性吗? 有人说GC可以方便地打破循环依赖关系,但使用智能指针(如

weak_ptr
)来实现这一目的难道不好吗

如果抛出异常会发生什么情况?如何修改堆栈展开语义以考虑GC

是否还会引入类似C的
IDisposable
模式


此外,假设C++中引入了GC,指针语法会不同吗?e、 g.在C++/CLI或C++/CX扩展中是否会有一些类似帽子的“指针”?应该有一种方法来区分普通的原始指针和“托管”指针,对吗?

该提案没有引入垃圾收集器——它只允许在实现选择的某些情况下使用垃圾收集器。本标准仅将这些情况描述为导致未定义的行为。通过这样做,它放松了实现的要求,为垃圾收集器提供了最小的回旋余地

中给出的简单示例考虑了将指针指向动态分配的对象,将其与另一个值异或,从而隐藏指针值,然后恢复原始指针值以通过它访问对象。在C++11之前,这将是非常好的,并且仍然可以使用。然而,现在这样的操作(见下一段)可能被认为是未定义的行为,这意味着实现可以对指向的对象进行垃圾收集

该标准规定,实现既可以具有宽松的指针安全性(在这种情况下,行为与以前一样),也可以具有严格的指针安全性(允许引入垃圾收集器)

实现可能具有放松的指针安全性,在这种情况下,指针值的有效性不取决于它是否是安全派生的指针值。或者,实现可能具有严格的指针安全性,在这种情况下,非安全派生指针值的指针值是无效的指针值,除非引用的完整对象具有动态存储持续时间,并且之前已声明可访问(20.6.4)。[…]实现定义了是否 具有放松或严格的指针安全性

如果指针值指向动态分配的对象,并且没有发生任何有趣的事情(具体定义见§3.7.4.3),则指针值是安全派生的指针值

如果您的实现具有严格的指针安全性,但您仍然希望在不引入未定义行为的情况下对指针执行上述有趣的操作,则可以将指针
p
声明为可访问,如下所示:

declare_reachable(p);

此函数在
标题中定义,以及相关函数,如
未声明的\u可访问的
声明的\u无\u指针
,以及
未声明的\u无\u指针
。您还可以使用Bjarne Stroustrup提供的
get\u pointer\u safety

确定实现的严格性:

<>实际上,我所说的是“当(不)自动垃圾收集成为C++的一部分时,它是可选的”。

有人提议从标准中删除此GC支持:

有一个C++的GC(BOEHM):


C++没有GC,它永远不会有一个。@ C++的GraceCalbern LGCs已经存在了很久。垃圾回收不是语言的一部分。然而,新的语言特性试图使C++的垃圾收集库更容易创建。任何地方都没有这样的规范:任何实现都可以自由地做任何他们想做的事情。@ AlxaMaBeLaLeC+C++已经有GC,它只是不标准。事实上,有人提议将其添加到C++11中,但委员会已经没有时间了?不,还是什么?如果抛出异常,标准没有说明GC的行为?@Mr.C64。这里没有提到垃圾收集器。