C++ cli CLI/C++;转换;这";指向整数的指针

C++ cli CLI/C++;转换;这";指向整数的指针,c++-cli,C++ Cli,我试图在CLI/C++程序中跟踪托管对象的创建/处置: ::System::Diagnostics::Trace::WriteLine(String::Format( "Created {0} #{1:X8}", this->GetType()->Name, ((UInt64)this).ToString())); 这与 错误C2440:“类型强制转换”:无法从“MyType^const”转换为“unsigned\uu int64” 有没有一种方法可以通过

我试图在CLI/C++程序中跟踪托管对象的创建/处置:

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

错误C2440:“类型强制转换”:无法从“MyType^const”转换为“unsigned\uu int64”

有没有一种方法可以通过这种方式跟踪唯一的对象ID?
谢谢

MyType^const是一个引用类型。因此,它位于托管内存空间中,您无法获得指向这些类型的直接内存指针,因为它们可以随时更改

有没有一种方法可以通过这种方式跟踪唯一的对象ID?谢谢


您可以使用MyType.GetHashCode()

查看
GCHandle
类型:。看起来它可以做你想做的事情,尽管它看起来用于你的目的会有点痛苦…

即使你可以将这个转换成某个整数来显示,它也可能不是一个有用的唯一标识符。这是因为与C++不同,C++(C++/CLI)中的(托管)对象的位置(以及扩展值)可能在该对象的生命周期期间发生变化。(逻辑上)相同的对象可以在程序中的不同点打印两个不同的字符串。

首先,为什么这不起作用。托管句柄类型不是指针。它们不仅仅是地址。托管类型的实例可以并且将被GC访问,因此地址不稳定;因此,为什么它不允许您执行这样的强制转换(因为GC可以在任何时候执行,并且您不知道何时执行,任何尝试使用这样的地址作为原始值的行为本质上都是一种竞争条件)

另一件经常被推荐但实际上不起作用的事情是
Object.GetHashCode()
。首先,它返回一个
int
,显然不足以在x64上唯一。此外,文档并不能保证值是唯一的,而且它们实际上不在2.0+中


唯一有效的解决方案是为您的对象创建
System.Runtime.InteropServices.GCHandle
的实例,然后将其强制转换为
IntPtr
——这保证了它的唯一性和稳定性。

这有一个警告,即您必须记住在完成后清理GCHandle,不是吗?