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

Mr.*_*C64 40 c++ garbage-collection c++11

C++ 11的语言功能列表中有:

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

(但似乎没有在GCC和Clang中实施.)

为什么标准委员会引入了这种垃圾收集C++ langauge功能?

C++真的需要GC吗?RAII不是一个优秀的模式(可以统一用于内存和非内存资源,如套接字,文件,纹理......)?

GC会破坏使用RAII的C++代码模式的一致性吗?

有人说GC可以派上用场来打破循环依赖,但是weak_ptr为了这个目的,使用智能指针是不是可以呢?

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

并且还会IDisposable引入类似C#的模式吗?

此外,假设在C++中引入了GC,指针语法会不同吗?例如,我们是否会^像C++/CLI或C++/CX扩展中那样有类似帽子的"指针" ?应该有一种方法可以区分普通的原始指针和"托管"指针,对吧?

Jos*_*eld 55

该提议没有引入垃圾收集器 - 如果实现选择,它只在某些情况下允许它.该标准将描述这些情况导致未定义的行为.在这样做时,它放松了实施的要求,为垃圾收集器提供了最小的余地.

提案中给出的简单示例考虑当您获取指向动态分配对象的指针时,将其与另一个值进行异或,从而隐藏指针值,然后恢复原始指针值以通过它访问对象.在C++ 11之前,这将是完全正常的,它仍然有效使用.但是,现在这样的操作可能(见下一段)被认为是未定义的行为,这意味着实现可能会对指向的对象进行垃圾回收.

该标准规定实现可以放松指针安全性,在这种情况下行为就像以前一样,或严格的指针安全性,这允许引入垃圾收集器.

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

指针值是一个安全派生的指针值,如果它指向动态分配的对象并且没有任何有趣的业务发生(在§3.7.4.3中更具体地定义).

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

declare_reachable(p);
Run Code Online (Sandbox Code Playgroud)

这个函数是在所定义的<memory>报头,具有相关功能,例如沿undeclare_reachable,declare_no_pointersundeclare_no_pointers.您还可以使用确定实施的严格程度get_pointer_safety.

  • 为"有趣的商业"+1.那应该是在规范:) (10认同)

fja*_*don 19

来自Bjarne Stroustrup:

实际上,我所说的是"当(不是如果)自动垃圾收集成为C++的一部分时,它将是可选的".

http://www.stroustrup.com/slashdot_interview.html