其他分享
首页 > 其他分享> > c – “手柄”是否有适当的’包装所有权’?

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