【问题标题】:Garbage Collection in C++11C++11 中的垃圾回收
【发布时间】:2012-09-01 01:26:13
【问题描述】:

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

提到的事情之一是minimal garbage collection

根据这个blog post,VC10支持这个功能。

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

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

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ c++11 garbage-collection


    【解决方案1】:

    Minimal GC support (n2670) 仅表示包含 std::declare_reachable 之类的函数,并定义了“安全派生指针”的含义,因此使某些操作(如 XOR-ing 指针值)成为未定义行为,并且 GC不必担心。另请参阅 Bjarne Stroustrup's C++11 FAQ on the GC ABIn2585: Minimal Support for Garbage Collection and Reachability-Based Leak Detection

    该提案允许在 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)

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

    【讨论】:

    • 据我了解,3.8/4 是讨论“程序”的部分,不需要调用析构函数。换句话说,我们不需要说foo->~MyClass(); delete foo;。在 GC 情况下,可以合理地假设 GC 运行就像使用 delete 表达式 - 在这种情况下,GC 负责调用析构函数。
    猜你喜欢
    • 2011-11-29
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2010-11-01
    • 2013-05-02
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多