考虑以下内容:

#include <iostream>

public ref class TestClass {
public:
    TestClass() { std::cerr << "TestClass()\n"; }
    ~TestClass() { std::cerr << "~TestClass()\n"; }
};

public ref class TestContainer {
public:
    TestContainer() : m_handle(gcnew TestClass) { }

private:
    TestClass^ m_handle;
};

void createContainer() {
    TestContainer^ tc = gcnew TestContainer();
        // object leaves scope and should be marked for GC(?)
}


int main() {
    createContainer();

    // Manually collect.
    System::GC::Collect();
    System::GC::WaitForPendingFinalizers();

    // ... do other stuff

    return 0;
}

我的输出很简单:
TestClass()

我从来没有得到〜TestClass()。这是我在生产代码中遇到的一个问题的简化,其中多次清除并重新填充了句柄列表,并且从未调用过句柄析构函数。

我究竟做错了什么?

真诚的
瑞安

最佳答案

~TestClass()

声明一个Dispose函数。
!TestClass()

会声明一个终结器(等效于C#的~TestClass),该终结器将在gc集合上被调用(尽管不能保证)。

关于.net - C++/CLI中的垃圾收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/830119/

10-11 19:40