unique_ptr,自定义删除器和零规则

巴里

我正在编写一个使用两个使用C接口创建的对象的类。对象看起来像:

typedef struct... foo_t;
foo_t* create_foo(int, double, whatever );
void delete_foo(foo_t* );

(与相似bar_t)。因为是C ++ 11,所以我想将它们包装在一个智能指针中,所以我不必编写任何特殊方法。该类将对这两个对象拥有唯一的所有权,因此unique_ptr从逻辑上讲是合理的……但是我仍然必须编写一个构造函数:

template <typename T>
using unique_ptr_deleter = std::unique_ptr<T, void(*)(T*)>;

struct MyClass {
     unique_ptr_deleter<foo_t> foo_;
     unique_ptr_deleter<bar_t> bar_;

     MyClass()
         : foo_{nullptr, delete_foo}
         , bar_{nullptr, delete_bar}
     { }

     ~MyClass() = default;

     void create(int x, double y, whatever z) {
         foo_.reset(create_foo(x, y, z));
         bar_.reset(create_bar(x, y, z));
};

在另一面,有shared_ptr,我也不会写一个构造函数,或使用一个类型别名,因为我可以只通过在delete_fooreset()-尽管这使我MyClass能够复制,我不希望出现这种情况。

MyClass使用unique_ptr语义并且仍然坚持零规则的正确书写方式是什么

迈克·西摩

您的类无需声明析构函数(无论您是否声明为默认值,它都会获得正确的默认实现),因此仍应遵循“零规则”。

但是,您可以通过使deleters函数成为对象而不是指针来改善此问题:

template <typename T> struct deleter;
template <> struct deleter<foo_t> {
    void operator()(foo_t * foo){delete_foo(foo);}
};
template <> struct deleter<bar_t> {
    void operator()(bar_t * bar){delete_bar(bar);}
};

template <typename T>
using unique_ptr_deleter = std::unique_ptr<T, deleter<T>>;

这有一些好处:

  • unique_ptr并不需要存储一个额外的指针
  • delete函数可以直接调用,而不是通过指针调用
  • 您不需要编写构造函数;默认的构造函数将做正确的事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

unique_ptr 的有状态自定义删除器

如何制作unique_ptr和自定义删除器的副本

std :: unique_ptr <T []>和自定义分配器删除器

混淆使用unique_ptr和自定义删除器

std :: unique_ptr,自定义删除器和类型更改

如何使用lambda和功能作为unique_ptr的自定义删除器

将具有自定义删除器的unique_ptr移到shared_ptr

智能指针(unique_ptr)自定义删除器错误C2027和C2338

具有自定义删除器的unique_ptr构造函数被删除

使用带有unique_ptr的自定义删除器

使用自定义删除器在地图中存储unique_ptr

使用typedef为std :: unique_ptr指定自定义默认删除器

初级 5 版。来自自定义删除器函数的 unique_ptr 构造函数

使用std :: function对象将自定义删除器传递给std :: unique_ptr

未调用std :: unique_ptr中的自定义删除器

std :: unique_ptr使用带有很少参数的自定义删除器

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

如何为由 unique_ptr 管理的数组编写自定义删除器?

了解采用自定义删除器的unique_ptr的构造函数

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

初始化传递给unique_ptr自定义删除器的函子

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

如何将自定义删除器与std :: unique_ptr成员一起使用?

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

如何安全地重载std :: unique_ptr的自定义删除程序?

带有lambda自定义删除程序的std :: unique_ptr无法编译

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr