在派生类上使用带有自定义删除程序的std :: make_unique吗?

音色

假设我有一个名为的类Derived该类继承自名为的类BaseBase这很特殊-尽管可以使用new创建它,但必须通过自定义删除器对其进行销毁。

我希望将Baseunique_ptr与名为的自定义删除器一起使用BaseDeleter这也使我可以拥有从其派生的其他类Base为了异常安全和一致性,我想使用std::make_unique来声明我的unique_ptr

我创建了一个小片段来演示我想要的内容:

#include <memory>

class Base
{
};

class Derived : public Base
{
};

struct BaseDeleter
{
    void operator()(Base* base)
    {
        // Perform some special deleting
    }
};

class Big
{
public:
    Big()
    {
        //pointer.reset(new Derived()); // This works!
        pointer = std::make_unique<Derived, BaseDeleter>(); // But this doesn't...
    }

private:
    std::unique_ptr<Base, BaseDeleter> pointer;
};

int main()
{
    Big clazz;
}

不幸的是,这无法在Visual Studio 2015 Update 2和gcc-5.1上进行编译。ideone
为什么这不起作用?一个人怎么能std::make_unique分配这样的std::unique_ptr

天顶

这是的签名make_unique之一,我猜您希望使用该签名

template< class T, class... Args >
unique_ptr<T> make_unique( Args&&... args );

T您要创建的对象的类型在哪里,您要Args...转发给构造函数的参数的类型在哪里

如您所见,您无法使用make_*智能指针辅助功能(既不使用make_unique也不使用make_shared来指示自定义删除器

您必须显式构造指针,如下所示:

std::unique_ptr<T, D> ptr{new T{)};

如果删除程序不是默认可构造的,则可以执行以下操作:

std::unique_ptr<T, D> ptr{new T{}, d};

d删除程序的实例在哪里

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在派生类上使用 std::make_unique 和自定义删除器?

来自分类Dev

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

来自分类Dev

可以在函数调用中直接使用 make_unique 吗?

来自分类Dev

具有自定义删除程序类的STL向量和unique_ptr

来自分类Dev

std :: make_unique可以与抽象接口一起使用吗?

来自分类Dev

将std :: make_unique与自定义删除器一起使用

来自分类Dev

使用std :: make_unique <>进行分配

来自分类Dev

std :: make_unique <std :: thread>与lambda

来自分类Dev

std :: make_unique对SFINAE友好吗?

来自分类Dev

GDI +对象的std :: make_unique

来自分类Dev

'make_unique'不是'std'的成员

来自分类Dev

std :: make_unique与新的位置

来自分类Dev

自定义删除程序以通过std :: unique_ptr释放2D数组

来自分类Dev

std :: make_unique,匿名名称空间和ODR

来自分类Dev

如何使std :: make_unique成为我班上的朋友

来自分类Dev

R值引用和std :: make_unique

来自分类Dev

为什么 std::make_unique 调用复制构造函数

来自分类Dev

具有 ADL 支持的就地 make_unique

来自分类Dev

如何在clang 3.4中使用make_unique?

来自分类Dev

使用可变参数模板延迟make_unique

来自分类Dev

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

来自分类Dev

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

来自分类Dev

带有std :: make_unique的push_back或emplace_back

来自分类Dev

std :: make_unique和std :: unique_ptr与new之间的区别

来自分类Dev

std :: make_unique和std :: unique_ptr之间的区别与内部新

来自分类Dev

我如何将 std::make_unique<derived>() 转换为 std::unique_ptr<base>

来自分类Dev

使用带有自定义rng的std :: shuffle吗?

来自分类Dev

std :: make_shared和std :: make_unique在幕后如何工作?

来自分类Dev

Windows 10的自定义开始菜单-我可以删除程序列表吗?

Related 相关文章

  1. 1

    在派生类上使用 std::make_unique 和自定义删除器?

  2. 2

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

  3. 3

    可以在函数调用中直接使用 make_unique 吗?

  4. 4

    具有自定义删除程序类的STL向量和unique_ptr

  5. 5

    std :: make_unique可以与抽象接口一起使用吗?

  6. 6

    将std :: make_unique与自定义删除器一起使用

  7. 7

    使用std :: make_unique <>进行分配

  8. 8

    std :: make_unique <std :: thread>与lambda

  9. 9

    std :: make_unique对SFINAE友好吗?

  10. 10

    GDI +对象的std :: make_unique

  11. 11

    'make_unique'不是'std'的成员

  12. 12

    std :: make_unique与新的位置

  13. 13

    自定义删除程序以通过std :: unique_ptr释放2D数组

  14. 14

    std :: make_unique,匿名名称空间和ODR

  15. 15

    如何使std :: make_unique成为我班上的朋友

  16. 16

    R值引用和std :: make_unique

  17. 17

    为什么 std::make_unique 调用复制构造函数

  18. 18

    具有 ADL 支持的就地 make_unique

  19. 19

    如何在clang 3.4中使用make_unique?

  20. 20

    使用可变参数模板延迟make_unique

  21. 21

    std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

  22. 22

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

  23. 23

    带有std :: make_unique的push_back或emplace_back

  24. 24

    std :: make_unique和std :: unique_ptr与new之间的区别

  25. 25

    std :: make_unique和std :: unique_ptr之间的区别与内部新

  26. 26

    我如何将 std::make_unique<derived>() 转换为 std::unique_ptr<base>

  27. 27

    使用带有自定义rng的std :: shuffle吗?

  28. 28

    std :: make_shared和std :: make_unique在幕后如何工作?

  29. 29

    Windows 10的自定义开始菜单-我可以删除程序列表吗?

热门标签

归档