Gewusst wie: Deklarieren von Handles in systemeigenen Typen
Sie können keinen Handletyp in einem systemeigenen Typ deklarieren. vcclr.h stellt die typsichere Wrappervorlage gcroot
bereit, die auf ein CLR-Objekt aus dem C++-Heap verweist. Mit dieser Vorlage können Sie ein virtuelles Handle in einen systemeigenen Typ einbetten und so behandeln, als wäre es der zugrunde liegende Typ. In den meisten Fällen können Sie das gcroot
Objekt als eingebetteten Typ ohne Umwandlung verwenden. Allerdings müssen Sie für jedes, in, verwenden static_cast
, um den zugrunde liegenden verwalteten Verweis abzurufen.
Die gcroot
Vorlage wird mithilfe der Möglichkeiten der Wertklasse System::Runtime::InteropServices::GCHandle implementiert, die "Handles" in den Garbage Collection Heap bereitstellt. Beachten Sie, dass die Handles selbst nicht garbage collection sind und freigegeben werden, wenn der Destruktor in der gcroot
Klasse nicht mehr verwendet wird (dieser Destruktor kann nicht manuell aufgerufen werden). Wenn Sie ein gcroot
Objekt auf dem systemeigenen Heap instanziieren, müssen Sie die Löschung für diese Ressource aufrufen.
Die Laufzeit Standard eine Zuordnung zwischen dem Handle und dem CLR-Objekt enthalten, auf das verwiesen wird. Wenn das CLR-Objekt mit dem garbage-collection heap verschoben wird, gibt das Handle die neue Adresse des Objekts zurück. Eine Variable muss nicht angeheftet werden, bevor sie einer gcroot
Vorlage zugewiesen wird.
Beispiele
In diesem Beispiel wird gezeigt, wie Sie ein gcroot
Objekt im systemeigenen Stapel erstellen.
// mcpp_gcroot.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;
class CppClass {
public:
gcroot<String^> str; // can use str as if it were String^
CppClass() {}
};
int main() {
CppClass c;
c.str = gcnew String("hello");
Console::WriteLine( c.str ); // no cast required
}
hello
In diesem Beispiel wird gezeigt, wie Sie ein gcroot
Objekt auf dem systemeigenen Heap erstellen.
// mcpp_gcroot_2.cpp
// compile with: /clr
// compile with: /clr
#include <vcclr.h>
using namespace System;
struct CppClass {
gcroot<String ^> * str;
CppClass() : str(new gcroot<String ^>) {}
~CppClass() { delete str; }
};
int main() {
CppClass c;
*c.str = gcnew String("hello");
Console::WriteLine( *c.str );
}
hello
In diesem Beispiel wird gezeigt, wie gcroot
Verweise auf Werttypen (keine Verweistypen) in einem systemeigenen Typ mithilfe gcroot
des Feldtyps aufbewahrt werden.
// mcpp_gcroot_3.cpp
// compile with: /clr
#include < vcclr.h >
using namespace System;
public value struct V {
String^ str;
};
class Native {
public:
gcroot< V^ > v_handle;
};
int main() {
Native native;
V v;
native.v_handle = v;
native.v_handle->str = "Hello";
Console::WriteLine("String in V: {0}", native.v_handle->str);
}
String in V: Hello