2009-05-06 5 views
2

Betrachten Sie die folgenden:Garbage Collection in C++/CLI

#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; 
} 

Meine Ausgabe ist einfach: Testclass()

ich nie ~ Testclass(). Dies ist eine Vereinfachung eines Problems, das ich im Produktionscode habe, wo eine Liste von Handles gelöscht und mehrfach neu gefüllt wird und die Handle-Destruktoren niemals aufgerufen werden.

Was mache ich falsch?

Mit freundlichen Grüßen, Ryan

Antwort

5
~TestClass() 

deklariert eine Dispose-Funktion.

!TestClass() 

würde erklären, eine finaliser (das Äquivalent von C# 's ~TestClass), die auf einer gc Sammlung aufgerufen wird (obwohl das nicht garantiert ist).

+0

Vielen Dank, ich wusste nicht, dass dies der Fall war. – Ryan

+0

ja, leider so. Es ist eine dumme Designentscheidung. – gbjbaanb

+0

Und ich denke C++/CLI wird sicherstellen, dass TestClass IDispose implementiert, wenn Sie ~ TestClass() hinzufügen, damit andere .NET-Sprachen es verstehen. – MSalters