【发布时间】:2016-10-20 19:34:26
【问题描述】:
我偶然发现了这个问题:Using unique_ptr to control a file descriptor。 std::unique_ptr 并不适合通用句柄。更一般的类也是如此
template<class HandleType,HandleType nullvalue,class Deleter>
class Handle;
已经实现(也许在 boost 中),或者我应该自己动手。这个问题之前在 What wrapper class in C++ should I use for automated resource management?,但是现在我们有了 C++14,所以可以有更多的选择。
我还发现了以下提议:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3677.html。所以别人也想过这个问题。
【问题讨论】:
-
单独的“删除”类或函数过于复杂。只需将文件描述符包装在一个类中,其析构函数会关闭文件描述符。然后,使用任何你想要的智能指针:unique_ptr 或 shared_ptr。
-
@SamVarshavchik : .. 或者根本不使用 ptrs,只需移动构造函数。
-
老实说,我仍然认为 jalf 的答案是最好的答案,即使在 C++14 的世界中也是如此。每个实现都需要在构造函数和析构函数中调用不同的函数,而且代码还不够复杂,不足以让一个可重用的类值得付出努力。
-
@CodeGray。为什么当时写了
unique_ptr。毕竟,这是一个特殊情况:template<class T,class Deleter> class unique_ptr:Handle<T*,nullptr,Deleter>+operator*在一般情况下没有意义。 -
呃,unique_ptr 旨在管理指针的生命周期。在大多数情况下,您不需要专门化它。您只需让默认实现调用删除即可。要处理其他 [非常罕见的] 情况,您可以使用自定义删除器提供自己的专业化。我真的不知道这与特定资源的包装类有什么关系。泛型类实际上将有no code,您必须自己提供整个实现。有什么意义?
标签: c++ raii resource-management