2009-05-06 12 views
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を()。これは、プロダクトコードでハンドルのリストがクリアされ、複数回再パッキングされ、ハンドルデストラクタが呼び出されないという問題の単純化です。

私は間違っていますか?敬具

、 ライアン

答えて

5
~TestClass() 

は廃棄関数を宣言します。 (それが保証されないですが)

!TestClass() 

は、GCコレクションに呼び出されるfinaliser(C#の~TestClass相当)を宣言します。

+0

ありがとう、私はこれが事実であるとは思わなかった。 – Ryan

+0

ええ、残念ながらそうです。その愚かなデザインの決定。 – gbjbaanb

+0

そして、私はC++/CLIが〜TestClass()を追加すると、TestClassがIDisposeを実装していることを確認して、他の.NET言語がそれを理解できるようにします。 – MSalters

関連する問題