我知道CreateFile返回的无效值是INVALID_HANDLE_VALUE。但是既然我也喜欢使用RAII,那么将HANDLE放在shared_ptr中是非常诱人的(像这样:
shared_ptr<void> handle (CreateFile(args),&CloseHandle)
)
确保手柄已关闭。
我唯一担心这种快速简便的RAII方法是CreateFile可以返回NULL作为HANDLE值。
答案 0 :(得分:6)
NULL
不是有效的句柄值。您可以从某些Windows API函数返回NULL
以指示失败的事实中辨别出这一点。由于只有一个函数来处理句柄CloseHandle
,因此NULL
不是有效的HANDLE
值。因此,CreateFile
无法返回NULL
。
Raymond Chen写了一篇关于这个主题的博客文章:Why are HANDLE return values so inconsistent?。
现在,我对shared_ptr<>
一无所知,所以不想评论你的想法是否合适。我只是回答你提出的直接问题。
答案 1 :(得分:1)
以通用方式测试HANDLE的有效性时,请检查NULL
和INVALID_HANDLE_VALUE
。
但我不知道RAII与CreateFile
是否可以返回NULL
有什么关系。您需要提供用于测试有效性和解除分配的自定义代码,以使HANDLE
能够使用共享指针,因此您可以控制这些检查,而不是共享指针类。
换句话说,它是在共享指针中还是使用普通HANDLE
没有区别,检查完全相同,你必须以任何一种方式提供它们。
答案 2 :(得分:0)
CreateFile永远不会返回NULL
。我建议您使用已创建的包装器ATL::CAtlFile
,并且不要基于shared_ptr
创建新包装器。