是否有适用于“手柄”的“整体所有权”?

pep*_*ico 5 c++ raii ownership-semantics handle c++11

除指针外,句柄具有适当的语义。所以对我来说这样的例子(从零规则中提取):

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;
};
Run Code Online (Sandbox Code Playgroud)

使用unique_ptr作为用于把手的所有权-在级封装“是一个坏的例子。首先,它利用内部知识,即句柄是指针类型,并使用它使unique_ptr“不透明”句柄类型建立在基本类型上。

句柄可以是任何类型,它们可能是一个指针,它们可能是一个索引或谁知道。最重要的是,您手头上的(例如来自大多数 C API)是一个句柄及其资源释放函数。

是否有适用于句柄语义的适当的“包内所有权” ?我的意思是,已经公开可供使用?

对我来说,unique_ptr等。阿尔。不起作用,我必须对句柄类型什么做出不必要的假设,当我想要的只是通过不透明的句柄类型及其释放功能获得“包中的所有权”时。

通过查看句柄类型内部来构建此信息是没有意义的。这是一个手柄,应该没有关系。

我将在另一个问题的 答案中引用另一个 SO 用户的感受:

创建一个特定的“智能指针”类,不会花很长时间。不要滥用图书馆课程。句柄语义与 C++ 指针的语义完全不同;一方面,取消引用 HANDLE 是没有意义的。

使用自定义智能句柄类的另一个原因 - NULL 并不总是意味着空句柄。有时是 INVALID_HANDLE_VALUE,这是不一样的。

免责声明:

这个问题重新表述并建立在这个问题的基础上:

pep*_*ico 0

std::实验::unique_resource

  • 如果您的删除器是默认可构造的,则不会。关键是 make_scoped_resource 就像 unique_ptr 的带有删除器的 ctor 一样,永远不应该在客户端代码中使用。它只能在库函数中使用。像“make_gl_list”之类的东西,内部可能使用“make_scoped_resource”,但不强制客户端关心它。 (2认同)