考虑以下内容:
#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/