C ++ 11垃圾收运 - 为什么和怎么样了(C++11 Garbage Collector - W

2019-07-20 19:22发布

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

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

(但似乎没有在任何GCC和锵实现)。

为什么标准委介绍,这个垃圾收集C ++的langauge功能?

难道C ++真的需要一个GC? 是不是RAII如此出色的模式(一个可统一对内存和非内存资源可以使用,如插座,文件,纹理...)?

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

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

而在例外的情况下,会发生什么抛出? 如何将堆栈展开语义进行修改,以采取GC考虑吗?

而将类似C# IDisposable模式引入呢?

此外,假设一个GC在C ++引入,将指针的语法不同? 例如,我们会有一些帽子般的“指针” ^像在C ++ / CLI或C ++ / CX扩展? 应该有从普通的原始指针与“管理”指针来区分的方式,对不对?

Answer 1:

不引入垃圾收集器的建议-它只是允许它在某些情况下,如果实现选择 。 该标准将仅仅描述这些情况为引起未定义行为。 在这一过程中,它放宽了实施的要求,给了垃圾收集器的最小余地。

中给出的简单例子的建议 ,当你需要一个指向一个动态分配的对象,与另一个值XOR它,从而隐藏了指针的值,然后恢复原来的指针值通过它来访问对象认为。 C ++ 11之前,这将是完全正常的,它仍然将是有效的使用。 然而,现在这样的操作可能是(见下段)认为是未定义行为,这意味着实现可以做到这一点指出的对象垃圾收集。

该标准规定的实现可以有轻松的指针安全性 ,在这种情况下,行为是因为它是之前,还是严格的指针安全性 ,它允许引入垃圾收集。

实现可以有轻松的指针安全性 ,在这种情况下,指针值的合法性并不取决于它是否是一个安全的衍生指针值。 可替代地,一种实施方式可以具有严格的指针的安全性 ,在这种情况下的指针值,该值是不是一个安全地衍生的指针值是无效的指针值,除非引用完整的对象是动态存储持续时间的和先前已被宣布可到达(20.6.4 )。 [...]这是定义的实现是否已经放松或严格指针安全的实现。

指针值是安全的,派生的指针值,如果它指向一个动态分配的对象,并没有任何不道德的行为发生在它(在§3.7.4.3详细定义)。

如果您的实施有严格的指针安全但你仍然想要做的说不道德的一个指针,而不会引入不确定的行为,你可以声明指针p为可达像这样:

declare_reachable(p);

这个功能是在所定义的<memory>头,具有相关功能,例如沿undeclare_reachabledeclare_no_pointers ,和undeclare_no_pointers 。 您也可以决定使用实施严格get_pointer_safety



Answer 2:

从Bjarne的Stroustrup的:

其实,我说的是什么“时(如果没有)自动垃圾收集成为C ++的一部分,这将是可选的。”

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



文章来源: C++11 Garbage Collector - Why and Hows