2
は下記考えてみましょう:ガベージコレクションが
#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を()。これは、プロダクトコードでハンドルのリストがクリアされ、複数回再パッキングされ、ハンドルデストラクタが呼び出されないという問題の単純化です。
私は間違っていますか?敬具
、 ライアン
ありがとう、私はこれが事実であるとは思わなかった。 – Ryan
ええ、残念ながらそうです。その愚かなデザインの決定。 – gbjbaanb
そして、私はC++/CLIが〜TestClass()を追加すると、TestClassがIDisposeを実装していることを確認して、他の.NET言語がそれを理解できるようにします。 – MSalters