我试图在CLI/C++ prog中跟踪托管对象的创建/处置:
::System::Diagnostics::Trace::WriteLine(String::Format(
"Created {0} #{1:X8}",
this->GetType()->Name,
((UInt64)this).ToString()));
Run Code Online (Sandbox Code Playgroud)
哪个失败了
error C2440: 'type cast' : cannot convert from 'MyType ^const ' to 'unsigned __int64'
有没有办法以这种方式跟踪唯一对象ID?谢谢!
首先,为什么这不起作用.托管句柄类型^
不是指针.它们不仅仅是地址.托管类型的实例可以并且将在 GC中在内存中移动,因此地址不稳定; 因此,为什么它不会让你做这样的演员表(因为GC可以在任何时刻执行,你不知道什么时候,任何使用这样的地址作为原始值的尝试本质上都是竞争条件).
另一件经常被推荐但实际上不起作用的事情是Object.GetHashCode()
.首先,它返回一个int
,显然不足以在x64上独一无二.此外,文档不保证值是唯一的,并且它们实际上不是2.0+.
唯一可行的解决方案是System.Runtime.InteropServices.GCHandle
为您的对象创建一个实例 ,然后将其转换为IntPtr
- 保证既独特又稳定.
归档时间: |
|
查看次数: |
2027 次 |
最近记录: |