2009-12-30 36 views
2

我試圖跟蹤管理對象的創建/在CLI/C處置++ PROG:CLI/C++的轉換 「這個」 指針整數

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

從而未能與

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

有沒有辦法跟蹤這種獨特的對象ID? 謝謝!

回答

4

首先,爲什麼這是行不通的。託管句柄類型^不是指針。他們不只是地址。受管理類型的一個實例可以由GC進行並且將爲moved around in memory,因此地址不穩定;因此爲什麼它不會讓你做這樣的鑄件(如GC可以在任何時刻執行,而你不知道什麼時候,任何企圖利用這樣的地址作爲原始值本質上是一個競爭條件)。

,往往是建議,但不實際工作的另一件事,是Object.GetHashCode()。首先,它返回一個int,顯然不足以在x64上唯一。此外,文檔不保證這些值是唯一的,而且它們實際上不在2.0以上。

唯一的工作解決方案是爲您的對象創建一個System.Runtime.InteropServices.GCHandle的實例,然後將其轉換爲IntPtr - 這是保證唯一性和穩定性。

+0

這有,你要記得清理的GCHandle當你做了,沒有警告? – 2009-12-30 21:00:29

-1

的MyType^const爲引用類型。因此,它位於託管內存空間中,並且無法獲取這些類型的直接內存指針,因爲它們可以隨時更改。

有沒有辦法跟蹤唯一的對象ID這種方式?謝謝!

您可以使用MyType.GetHashCode();

1

即使你可以投this某些積分值顯示,它可能不會是一個有用的唯一標識符。這是因爲不像C++,在C++/CLI的位置(託管)對象(通過擴展的此值)可以在該對象的生命週期潛在地改變。 (邏輯上)相同的對象可以在程序中的不同點上打印兩個不同的字符串。