C++11中的垃圾回收机制

26

我一直在研究和尝试C++11的不同特性,特别是在Visual Studio 2010中。

其中提到的一个东西是极小化垃圾回收

根据这篇 博客文章,VC10支持此功能。

我的测试表明,对于丢失的对象,析构函数不会被调用,因此我不确定它们的内存位置是否已被释放或者它们是否在泄漏。

我绝不打算依赖它,但是无法找到一个直接的、明确的答案来解释它的行为。

1个回答

37

最小化GC支持(n2670)仅意味着包括像std::declare_reachable这样的函数,并定义了“安全派生指针”的含义,因此某些操作,如异或指针值变得未定义行为,而GC不需要担心它。另请参见Bjarne Stroustrup的有关GC ABI的C++11 FAQn2585:垃圾回收和基于可达性的泄漏检测的最小支持

该提案允许在C++11框架内实现GC。但是,该提案本身并不意味着实现需要支持GC。一些库,如libc++,只需将库函数实现为无操作。

我相信,在这一点上,你的情况下内存只是泄漏了。但请注意,析构函数确实不需要在GC发生时运行。假设“§3.8对象生存期”也适用于GC指针,则我们有(§3.8 / 4):

…对于具有非平凡析构函数的类类型对象,在释放或重新使用所占用的存储之前,程序不需要显式调用析构函数; 但是,如果没有显式调用析构函数或者没有使用delete表达式(5.3.5)释放存储,则析构函数不得被隐式调用,并且任何依赖于析构函数产生的副作用的程序都具有未定义行为。

因此,也有可能在没有调用析构函数的情况下已经释放了内存。事实上,早期的GC提案,如n2310:透明程序员指导的C++垃圾收集显式声明(n2310 §7)

当对象被垃圾收集器回收时,它的析构函数不会被调用(当然,显式删除总是会调用析构函数)。


据我理解,3.8/4 是一个关于“程序”的部分,不需要调用析构函数。换句话说,我们不需要写 foo->~MyClass(); delete foo;。在 GC 的情况下,可以合理地假设 GC 运行就像使用 delete 表达式一样 - 在这种情况下,GC 负责调用析构函数。 - Eponymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接