2 Stimmen

CLI/C++ Umwandlung des Zeigers "this" in eine Ganzzahl

Ich versuche, die Erstellung/Disposition von verwalteten Objekten in einem CLI/C++-Programm zu verfolgen:

::System::Diagnostics::Trace::WriteLine(String::Format(
    "Created {0} #{1:X8}", 
    this->GetType()->Name,
    ((UInt64)this).ToString()));

Das scheitert bei

error C2440: 'type cast' : cannot convert from 'MyType ^const ' to 'unsigned __int64'

Gibt es eine Möglichkeit, die eindeutigen Objekt-IDs auf diese Weise zu verfolgen? Danke!

5voto

Pavel Minaev Punkte 97251

Zunächst einmal, warum das nicht funktioniert. Verwaltete Handle-Typen ^ sind keine Zeiger. Sie sind nicht nur Adressen. Eine Instanz eines verwalteten Typs kann und wird in den Speicher verschoben von GC, so dass Adressen nicht stabil sind; daher würde es nicht zulassen, dass Sie eine solche Besetzung (wie GC kann jederzeit ausgeführt werden, und Sie wissen nicht, wann, jeder Versuch, eine solche Adresse als Rohwert zu verwenden ist von Natur aus eine Race Condition).

Eine andere Sache, die oft empfohlen wird, aber nicht wirklich funktioniert, ist Object.GetHashCode() . Zum einen liefert es eine int , offensichtlich nicht genug, um auf x64 einzigartig zu sein. Außerdem garantiert die Dokumentation nicht, dass die Werte eindeutig sind, und das sind sie auch in 2.0+ nicht.

Die einzige funktionierende Lösung ist die Erstellung einer Instanz von System.Runtime.InteropServices.GCHandle für Ihr Objekt, und übertragen Sie es dann auf IntPtr - die garantiert einzigartig und stabil ist.

1voto

Sehen Sie sich die GCHandle Typ: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx . Sieht aus wie es tun würde, was Sie wollen, obwohl es sieht es wäre ein bisschen ein Schmerz zu verwenden für Ihre Zwecke ...

1voto

Logan Capaldo Punkte 38523

Selbst wenn Sie die this in einen ganzzahligen Wert für die Anzeige umwandeln, wäre dies wahrscheinlich kein nützlicher eindeutiger Bezeichner. Denn anders als in C++ kann sich in C++/CLI der Ort eines (verwalteten) Objekts (und damit auch der Wert dieses Objekts) potenziell ändern während die Lebensdauer des Objekts. Das (logisch) gleiche Objekt kann an verschiedenen Stellen im Programm zwei verschiedene Zeichenketten drucken.

-1voto

cwap Punkte 10738

MyType ^const ist ein Referenztyp. Daher befindet er sich im verwalteten Speicherbereich, und Sie können keine direkten Speicherzeiger auf diese Typen erhalten, da sie sich jederzeit ändern können.

Gibt es eine Möglichkeit, die eindeutigen Objekt-IDs auf diese Weise zu verfolgen? Danke!

Sie könnten MyType.GetHashCode() verwenden;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X