我正在尝试在CLI / C ++ prog中跟踪托管对象的创建/处理:
::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? 谢谢!
答案 0 :(得分:5)
首先,为什么这不起作用。托管句柄类型^
不是指针。它们不仅仅是地址。托管类型的实例可以并且将是moved around in memory GC,因此地址不稳定;因此,为什么它不会让你做这样的演员表(因为GC可以在任何时刻执行,你不知道什么时候,任何使用这样的地址作为原始值的尝试本质上都是竞争条件)。
经常被推荐的另一件事,但实际上并不起作用,是Object.GetHashCode()
。首先,它返回int
,显然不足以在x64上独一无二。此外,文档不保证值是唯一的,并且它们实际上不在2.0 +。
唯一可行的解决方案是为您的对象创建一个System.Runtime.InteropServices.GCHandle
的实例,然后将其强制转换为IntPtr
- 这将保证既独特又稳定。
答案 1 :(得分:1)
查看GCHandle
类型:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx。看起来它会做你想要的,虽然它看起来有点用于你的目的... ...
答案 2 :(得分:1)
即使您可以将this
转换为显示的某个整数值,它也可能不是一个有用的唯一标识符。这是因为与C ++不同,在C ++ / CLI中,(托管)对象的位置(以及扩展名为this的值)可能会在对象的生命周期内发生。 (逻辑上)相同的对象可以在程序的不同点打印两个不同的字符串。
答案 3 :(得分:-1)
MyType ^ const是一种引用类型。因此,它位于托管内存空间中,您无法获得这些类型的直接内存指针,因为它们可以随时更改。
有没有办法以这种方式跟踪唯一对象ID?谢谢!
您可以使用MyType.GetHashCode();