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
Vielen Dank, ich wusste nicht, dass dies der Fall war. – Ryan
ja, leider so. Es ist eine dumme Designentscheidung. – gbjbaanb
Und ich denke C++/CLI wird sicherstellen, dass TestClass IDispose implementiert, wenn Sie ~ TestClass() hinzufügen, damit andere .NET-Sprachen es verstehen. – MSalters