c – “手柄”是否有适当的’包装所有权’?
作者:互联网
Handles具有除指针之外的适当语义.所以对我来说这样的例子(摘自Rule of Zero):
class module {
public:
explicit module(std::wstring const& name)
: handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {}
// other module related functions go here
private:
using module_handle = std::unique_ptr<void, decltype(&::FreeLibrary)>;
module_handle handle;
};
使用unique_ptr作为句柄的’所有权’包是一个坏例子.首先,它利用句柄类型的内部知识,并使用它来使“opaque”句柄类型构建的基本类型的unique_ptr.
句柄可以是任何类型,它们可以是指针,它们可以是索引或者谁知道.最重要的是,你手边的东西(例如来自大多数C API)是一个句柄及其资源释放功能.
是否存在适用于句柄语义的’所有权一揽子’?我的意思是,已经公开供一个人使用?
对我来说,unique_ptr等.人.不起作用,我必须对句柄类型做出不必要的假设,当我想要的只是通过不透明句柄类型及其释放函数来获得“包中所有权”时.
在句柄类型内部进行对等以对此信息进行构造是没有意义的.它是一个手柄,它应该没关系.
我在这里引用another question’s answer中另一个SO用户的感受:
Create a specific “smart pointer” class, won’t take long. Don’t abuse
library classes. Handle semantics is quite different from that of a
C++ pointer; for one thing, dereferencing a HANDLE makes no sense.One more reason to use a custom smart handle class – NULL does not
always mean an empty handle. Sometimes it’s INVALID_HANDLE_VALUE,
which is not the same.
免责声明:
这个问题重新构建并建立在这个问题之上:
> Where’s the proper (resource handling) Rule of Zero?
解决方法:
unique_ptr类型不像短语“handle”,是的.但为什么不应该呢?只是一个“句柄”示例(比如,一个整数索引),就像unique_ptr一样通用.您无法将一种特定类型的句柄与“所有句柄”进行比较.
如果你想要一个单独的,具体的C类型(或类型模板),它是一个句柄而没有实际定义任何特定的处理语义,那么…我无法帮助你.我不认为任何人都可以做到.
标签:handle,raii,c,c11,ownership-semantics 来源: https://codeday.me/bug/20190926/1820350.html