首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IntPtr、SafeHandle和HandleRef -解释

IntPtr、SafeHandle和HandleRef -解释
EN

Stack Overflow用户
提问于 2009-02-08 23:36:46
回答 2查看 20.3K关注 0票数 46

如果不告诉我MSDN,有没有人可以给出一个简洁,清晰的解释每一个的目的,以及何时使用它们。(IntPtr、SafeHandle和HandleRef)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-09 00:45:25

IntPtr只是一个简单的基于整数的结构,可以保存指针(即32位系统上的32位大小,64位系统上的64位大小)。

SafeHandle是一个用来保存Win32对象句柄的类-它有一个终结器,可以确保在对象被GC时句柄是关闭的。SafeHandle是一个抽象类,因为不同的Win32句柄有不同的关闭方式。在引入SafeHandle之前,IntPtr用于保存Win32句柄,但确保它们被正确关闭并防止被GC是程序员的责任。

HandleRef是一种确保非托管句柄在P/Invoke调用过程中不会被GC调用的方法。如果没有像HandleRef这样的东西,如果托管代码在P/Invoke调用之后没有对句柄做任何事情,如果GC是在P/Invoke调用期间运行的,它将不会意识到句柄仍在使用中,并且可能会对其进行GC。我想象(但我不确定也没有看过) SafeHandle可能会使用HandleRef作为其封装句柄管理的一部分。

票数 55
EN

Stack Overflow用户

发布于 2010-02-18 07:36:50

代码语言:javascript
复制
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);

假设这是程序中对"a“的唯一引用,则等同于:

代码语言:javascript
复制
HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);

问题是,当"a“被释放时,它将关闭句柄。如果在调用SendMessage之前或调用过程中发生这种情况,句柄将无效。

HandleRef防止"a“在程序使用h结束之前被垃圾回收。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/526661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档