是否有一种方便的方法来使unique_ptr自动具有诸如shared_ptr的删除器?

玉米秸秆

std::shared_ptr 有一个漂亮的模板化构造函数,可以自动为其给定类型创建正确的删除器(该链接中的构造函数2)。

直到现在,我(错误地)认为std::unique_ptr有一个类似的构造函数,但是当我运行以下代码时:

#include <memory>
#include <iostream>

// Notice nothing is virtual
struct Foo
{
    ~Foo() { std::cout << "Foo\n"; }
};

struct Bar : public Foo
{
    ~Bar() { std::cout << "Bar\n"; }
};

int main()
{
    {
        std::cout << "shared_ptr:\n";
        std::shared_ptr<Foo> p(new Bar()); // prints Bar Foo
    }

    {
        std::cout << "unique_ptr:\n";
        std::unique_ptr<Foo> p(new Bar()); // prints Foo
    }
}

我惊讶地发现unique_ptr它不称为Bar析构函数。

什么是一种干净,简单且正确的方法来创建一个unique_ptr为其给定指针具有正确删除器的对象?特别是如果我想存储这些的完整列表(即std::vector<std::unique_ptr<Foo>>),这意味着它们都必须具有异构类型?

(原谅可怜的头衔;随时提出更好的头衔)

干杯和hth。-阿尔夫

这是一种方法:

{
    std::cout << "unique_ptr<Bar, void(void*)>:\n";
    std::unique_ptr<Foo, void(*)(void*)> p(
        new Bar(), [](void*p) -> void { delete static_cast<Bar*>( p ); }
        ); // prints Bar Foo
}

这种方法的主要问题是unique_ptr支持转换为逻辑“指向基类的指针”,但是该标准不保证转换为void*将会产生相同的地址。实际上,如果基类是非多态的,而派生类是多态的,这只是一个问题,这会引入vtable ptr并因此可能会稍微改变内存布局。但是,在这种可能(但不太可能)的情况下,在删除器中进行回退将产生不正确的指针值并爆炸。

因此,上述内容对于此类转换在形式上并不安全。


要与do大致相同shared_ptrshared_ptr支持转换为从逻辑指针到基址的指针),您还需要将原始void*指针与删除器一起存储


通常,当您控制最顶层的基类时,请将其析构函数设为虚拟。

这样就可以了。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

模板别名shared_ptr和unique_ptr时是否有陷阱或限制?

来自分类Dev

有没有一种方法可以将shared_ptr <void>转换为shared_ptr <T>?

来自分类Dev

除了sudo之外,是否有一种可靠的方法来使多个用户帐户具有root用户的行为?

来自分类Dev

有没有一种方法可以将模板的类型转换为shared_ptr <T>?

来自分类Dev

在Chapel中是否有一种方便的方法来用随机值填充稀疏数组?

来自分类Dev

是否要从unique_ptr构造shared_ptr?

来自分类Dev

从unique_ptr创建一个shared_ptr

来自分类Dev

C ++ Microsoft的ComPtr与c ++ unique_ptr,shared_ptr有什么区别?

来自分类Dev

C ++ Microsoft的ComPtr与c ++ unique_ptr,shared_ptr有什么区别?

来自分类Dev

如何取得std :: unique_ptr和std :: shared_ptr的所有权

来自分类Dev

使用带有boost python的unique_ptr-boost :: shared_ptr可以工作,但是unique_ptr不能

来自分类Dev

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

来自分类Dev

有没有一种好的自动方法来使通用文本块变成正方形?

来自分类Dev

Cython是否具有类似std :: unique_ptr的内容?

来自分类Dev

具有std :: unique_ptr的容器的访问器函数

来自分类Dev

是否有一种方便,可维护的方法来从函数内部获取实际参数列表?

来自分类Dev

在 Mobile Center 上构建时,是否有一种方便的方法来增加构建编号?

来自分类Dev

带有 lambda 删除器的 Unique_ptr

来自分类Dev

unique_ptr 的有状态自定义删除器

来自分类Dev

是否存在诸如weak_ptr之类的东西无法锁定(提升为shared_ptr)?如果没有,为什么?

来自分类Dev

是否有必要释放shared_ptr?

来自分类Dev

有没有一种方便的方法来在ruby中构建嵌套哈希

来自分类Dev

在Windows 7或Linux上,是否有一种快速/自动的方法来在晚上更改监视器的亮度?

来自分类Dev

具有虚拟类的unique_ptr

来自分类Dev

具有unique_ptr的结构向量

Related 相关文章

  1. 1

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

  2. 2

    配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

  3. 3

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

  4. 4

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

  5. 5

    模板别名shared_ptr和unique_ptr时是否有陷阱或限制?

  6. 6

    有没有一种方法可以将shared_ptr <void>转换为shared_ptr <T>?

  7. 7

    除了sudo之外,是否有一种可靠的方法来使多个用户帐户具有root用户的行为?

  8. 8

    有没有一种方法可以将模板的类型转换为shared_ptr <T>?

  9. 9

    在Chapel中是否有一种方便的方法来用随机值填充稀疏数组?

  10. 10

    是否要从unique_ptr构造shared_ptr?

  11. 11

    从unique_ptr创建一个shared_ptr

  12. 12

    C ++ Microsoft的ComPtr与c ++ unique_ptr,shared_ptr有什么区别?

  13. 13

    C ++ Microsoft的ComPtr与c ++ unique_ptr,shared_ptr有什么区别?

  14. 14

    如何取得std :: unique_ptr和std :: shared_ptr的所有权

  15. 15

    使用带有boost python的unique_ptr-boost :: shared_ptr可以工作,但是unique_ptr不能

  16. 16

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

  17. 17

    有没有一种好的自动方法来使通用文本块变成正方形?

  18. 18

    Cython是否具有类似std :: unique_ptr的内容?

  19. 19

    具有std :: unique_ptr的容器的访问器函数

  20. 20

    是否有一种方便,可维护的方法来从函数内部获取实际参数列表?

  21. 21

    在 Mobile Center 上构建时,是否有一种方便的方法来增加构建编号?

  22. 22

    带有 lambda 删除器的 Unique_ptr

  23. 23

    unique_ptr 的有状态自定义删除器

  24. 24

    是否存在诸如weak_ptr之类的东西无法锁定(提升为shared_ptr)?如果没有,为什么?

  25. 25

    是否有必要释放shared_ptr?

  26. 26

    有没有一种方便的方法来在ruby中构建嵌套哈希

  27. 27

    在Windows 7或Linux上,是否有一种快速/自动的方法来在晚上更改监视器的亮度?

  28. 28

    具有虚拟类的unique_ptr

  29. 29

    具有unique_ptr的结构向量

热门标签

归档