CLI / C ++将“this”指针转换为整数

时间:2009-12-30 19:45:19

标签: c++-cli

我正在尝试在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? 谢谢!

4 个答案:

答案 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();