Pau*_*sik 2 .net c# vb.net memory-management
在C++中,显示指向对象的指针的实际值非常简单.例如:
void* p = new CSomething();
cout << p;
Run Code Online (Sandbox Code Playgroud)
有没有办法在.NET中做这样的事情?
这样做的价值只能是教育性的,例如用于示范的目的,如为学生展示价值而不仅仅是比较参考相等或无效(无)来证明浅层副本,不变性等.
您可以使用GCHandle获取固定对象的地址.GC可以移动对象,因此唯一合理的地址是固定对象之一.
GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);
Console.WriteLine(handle.AddrOfPinnedObject().ToInt32());
handle.Free();
Run Code Online (Sandbox Code Playgroud)
请记住,GCHandle这只会固定原始或blittable类型的对象.某些对象是blittable(您可以将其设置为演示目的,因此它可以工作)但任何引用类型都不会是blittable.
您需要使用[StructLayout(LayoutKind.Sequential)]或使用调试器添加显式的blittable描述,以直接检查不符合这些条件的对象的地址.
如果这是出于教育目的,我建议您使用调试器.如果您将SOS.dll(它是.NET框架的一部分)加载到WinDbg甚至Visual Studio中,您可以检查内存中的实际对象.
例如,列出堆使用!dumpheap -stat命令.该!do命令将管理对象转储到指定的内存地址上,依此类推.SOS有许多命令可以让你检查内部的.NET结构,所以它是一个非常有用的工具,可以学习更多有关运行时的知识.
通过使用调试器,您不仅限于查看演示应用程序.您可以查看实际应用程序的详细信息.此外,您将获得一些非常有用的调试技巧.
使用WinDbg + SOS进行调试有几个很好的介绍.查看Tess的博客,了解大量教程.