26

我一直在研究和使用 C++11 的不同功能,特别是在 Visual Studio 2010 中。

提到的一件事是最小的垃圾收集

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

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

我无意以任何方式依赖它,但找不到关于其行为的直接、明确的答案。

4

1 回答 1

37

最小 GC 支持 (n2670) 仅表示std::declare_reachable包含类似函数,并定义“安全派生指针”的含义,因此使某些操作(如 XOR-ing 指针值)成为未定义行为,GC 无需担心关于它。另请参阅Bjarne Stroustrup 关于 GC ABI 的 C++11 FAQn2585:对垃圾收集和基于可达性的泄漏检测的最小支持

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

我很确定,此时,您的案例中的内存刚刚泄漏。但请注意,在 GC 发生时,确实不需要运行析构函数。假设“§3.8 对象生命周期”也提供给 GC-ed 指针,我们有(§3.8/4):

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

所以也有可能在没有调用析构函数的情况下内存已经被释放。事实上,早期的 GC 提案,例如n2310:Transparent Programmer-Directed Garbage Collection for C++明确指出(n2310 §7)

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

于 2012-09-07T08:02:18.547 回答