2012-06-16 18 views
12

Ich habe ein natives Objekt (C++), das einen gcroot Zeiger auf ein verwaltetes Objekt (C#) hat.Native und verwaltete Destruktoren

class SomeNativeClass { 
    gcroot<SomeManagedClass ^> managedClass; 
}; 

Frage Wenn ich eine native Instanz dieser Klasse in nativen Code löschen delete(someNativeClass), die ich vorher zugewiesen, wird die managedClass Instanz gesammelt bekommen Müll oder sollte ich es ausdrücklich (im nativen destructor) und löschen ?

+2

Sie können verwaltete Objekte nicht löschen, nur der Garbage Collector kann dies tun. Wenn die C# -Klasse IDisposable implementiert, sollten Sie sich wahrscheinlich bemühen, die Dispose() -Methode aufzurufen. –

+0

@HansPassant Vielen Dank für Ihre Antwort. Wenn nur das native Objekt gelöscht wird und das verwaltete Objekt nirgendwo anders referenziert wird, würde es dann zu einer Sammlung von Müll kommen? – GETah

Antwort

9

Wenn nur das native Objekt gelöscht wird und das verwaltete Objekt nirgendwo anders referenziert wird, wäre es dann Garbage Collection?

Das ist die Essenz der Garbage Collection. Der Collector zerstört ein Objekt, wenn er keinen Verweis auf das Objekt finden kann. Etwas anders geht es, wenn Sie die Template-Klasse gcroot <> verwenden. Der "normale" Weg, auf dem der Kollektor Verweise auf verwaltete Objekte findet, besteht darin, sie in CPU-Registern und dem Stapel verwaltetem Code und dem verwalteten Heap zu entdecken. Das kann nicht in nativem Code funktionieren, die gcroot <> Klasse hilft.

Der Gcroot <> Konstruktor ruft GCHandle :: Alloc() auf, um einen expliziten Verweis auf das Objekt zuzuweisen. Destruktor ruft GCHandle :: Free() auf, um es zu entfernen. Die Zuordnung dieser "Tracking-Handles" ist ein sekundärer Mechanismus in der CLR, der eine Tabelle für sie verwaltet, die der Kollektor zusätzlich zu den Referenzen, die er selbst findet, konsultiert.

Der Nettoeffekt ist, dass wenn der Klassendestruktor ausgeführt wird, wird automatisch der gcroot <> Destruktor aufgerufen. Objektverweis gegangen. Wenn dies die einzige Referenz ist, die in diesem Fall sehr wahrscheinlich ist, zerstört der nächste Garbage-Collection-Sweep das Objekt. Automatisch. Später.

+0

+1 Danke für detaillierte Antwort – GETah

Verwandte Themen