首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪种‘Which’口味是“`SafeHandle`”的候选口味?

哪种‘Which’口味是“`SafeHandle`”的候选口味?
EN

Stack Overflow用户
提问于 2017-06-12 16:49:10
回答 1查看 306关注 0票数 2

我正在为从CA2006返回的IntPtr获得一个Review usage of ... (a 'IntPtr' instance) to determine whether it should be replaced with a SafeHandle or CriticalHandle ("Review usage of ... (a 'IntPtr' instance) to determine whether it should be replaced with a SafeHandle or CriticalHandle"),我知道它是一个可以用FreeLocal释放的安全描述符。我只是简单地使用了它,而且可能不会泄漏所涉及的内存。据我所知,没有与内核句柄相关联。

有许多SafeHandle子类,它们似乎都没有在包装对象的生命周期结束时调用FreeLocal。但是,我无法找到关于哪些IntPtr实例(例如,由Win32 API返回的)由SafeHandle有效地管理以及哪些实例不是SafeHandle的确切信息。

我应该取消CA警告吗?

更重要的是,如何确定我将遇到的下一个IntPtr使用的相同值?

(将SafeHandle子类映射到最终将释放句柄的函数的表将是很棒的。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 12:58:01

如果您的问题是“是否已经有一个调用SafeHandle来释放其句柄的LocalFree子类”,那么是的,有--它是SafeLocalAllocHandle。这个类是internal,所以它对一般公众是不可用的,但是如果您想要重新创建它,代码是显而易见的。如果你的问题是“我应该使用这样的课程”,那么,这是一个判断。CA2006SafeHandle文档解释了设计原理:SafeHandle避免了多线程场景中句柄回收的问题,并且对P/调用具有特殊的支持,以确保句柄在完成非托管代码之前不会意外释放。

什么时候IntPtr是可以由SafeHandle包装的句柄?您将无法从IntPtr中分辨出来,您必须知道返回IntPtr的函数是什么。它将记录您是否正在处理一个句柄,如果是的话,您应该如何关闭句柄当您完成它(经常,但不是总是,CloseHandle)。如果您只有一个P/Invoke签名,那么从技术上讲,您什么也没有。特别是,如果句柄是句柄,则无法确定应该调用哪个函数来释放句柄。IntPtr还可以用于封送PVOIDSIZE_TP<some_struct> (尽管outref参数对此更为自然)或任何其他类型的指针大小。

任何超出单个函数(特别是存储在字段中的函数)的句柄即为IntPtr都是SafeHandle包装器的好选择,同时使用多个IntPtr(防止意外地混合不兼容的句柄)也是很好的选择。对于不涉及多线程且不让句柄超出其范围的简单一次性操作,try .. finally块可能就足够了。如果您愿意,为了一致性(或者显式地记录您所处理的对象类型),可以将所有内容包装在SafeHandle中,但这并不一定会带来更好的结果。句柄回收是一个严重的问题,但这里不关心,因为句柄是本地内存,可靠性不是一个问题,因为任何严重到足以绕过finally块的问题也严重到足以使小内存泄漏成为非问题。

您的特定场景(将SDDL解析为安全描述符)已经在框架中以RawSecurityDescriptor的形式实现了,您应该考虑使用它来重新创建轮子(如果System.Security.AccessControl中的现有类还没有涉及到它,那么就实现您自己的SecurityDescriptor子类)。不管它的价值是什么,RawSecurityDescriptor也会调用ConvertStringSecurityDescriptorToSecurityDescriptorW,而不会费心使用SafeHandle。框架代码不一定被看作是做什么的好例子(很多代码违反了官方准则),但这是有意义的。

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

https://stackoverflow.com/questions/44504715

复制
相关文章

相似问题

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