C ++入门手册第5版:shared_ptr的删除器和unique_ptr的删除器之间的区别

大师

在“ C ++ Primer,第5版”中,据说a的删除器的类型shared_ptr直到运行时才知道,因为该删除器不是直接存储为成员,而是存储为可以指向删除器的指针。中的删除器类型unique_ptr在编译时是已知的,因为它是其unique_ptr本身的一部分

所以,我做了这个例子:

#include <functional>

template <typename T>
struct SharedPtr
{
    void(*pDel_)(T*) = nullptr;
    T* ptr_{ new T{} };
    ~SharedPtr(){ pDel_ ? pDel_(ptr_) : delete ptr_; }
};

template <typename T, typename D = std::function<void(T*)>>
struct UniquePtr
{
    D pDel_;
    T* ptr_{ nullptr };
    UniquePtr(T* p = nullptr, D del = D{}) :
        ptr_(p), pDel_(del){}
    ~UniquePtr(){ pDel_(ptr_); }
};

int main()
{
    SharedPtr<int> spi{};
    cout << *spi.ptr_ << endl;
    UniquePtr<std::string> upd{new std::string("Helo!"),
        [](std::string* p){std::cout << "freeing memory...\n"; delete p; }};

}
  • 我认为,删除器的类型SharedPtr在编译时(void(*)(T*)是已知的,但该值不是。

  • 另一方面,删除器的类型UniquePtr在编译时也确实是已知的,但该值可能也不是。

  • 所以这本书说:

// del bound at compile time; direct call to the deleter is instantiated
del(p);   // no run-time overhead
The type of del is either the default deleter type or a user-supplied type. It doesn’t
matter; either way the code that will be executed is known at compile time. Indeed, if
the deleter is something like our DebugDelete class (§ 16.1.4, p. 672) this call might
even be inlined at compile time.
By binding the deleter at compile time, unique_ptr avoids the run-time cost of an
indirect call to its deleter. By binding the deleter at run time, shared_ptr makes it
easier for users to override the deleter.

如果in中的deleterUniquePtr是指向函数的指针,但该指针是nullptr,则del(p)未定义。

请帮助我理解这一段。我已经实施了我的课程,shared_ptr并且unique_ptr仅作为练习。

埃雷里卡

我认为,SharedPtr中删除器的类型在编译时(void(*)(T*)是已知的,但其值不是。

您的SharedPtr确实如此。

std :: shared_ptr并非如此。

另一方面,在编译时也确实知道UniquePtr中删除器的类型,但再次可能不知道该值。

当使用实例化UniquePtr时std::function<void(T*)>,您只会在编译时知道该类型,而不能知道它包装的函数对象的类型。

std :: unique_ptr默认不使用std :: function删除器。

如果UniquePtr中的删除程序是一个函数的指针,但该指针为nullptr,则未定义del(p)。

这是真的。不要那样做

请帮助我理解这一段。

仅仅因为唯一的指针可以在编译时知道一个删除器,并不意味着它必须具有这样的删除器。函数包装器不是函数指针,也不是编译时删除器,因为它们具有运行时状态。

例如,使用无状态删除器std::default_delete<T>(或引号中提到的DebugDelete大概也是无状态的)来获得编译时的好处。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

来自分类Dev

C ++零规则:多态删除和unique_ptr行为

来自分类Dev

C ++入门手册第5版:shared_ptr的删除器和unique_ptr的删除器之间的区别

来自分类Dev

用unique_ptr和自定义删除器包装C代码

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

在C ++中的unique_ptr之间进行转换

来自分类Dev

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

来自分类Dev

错误C2280:尝试引用已删除的函数(unique_ptr)

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在C ++ 11中,如何最好地在unique_ptr中为普通数组创建迭代器?

来自分类Dev

C ++设置和shared_ptr

来自分类Dev

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

来自分类Dev

C ++ 11使用unique_ptr和自定义删除器

来自分类Dev

C ++入门5版:shared_ptr的容器

来自分类Dev

C ++入门5版:从uniqe_ptr初始化了shared_ptr吗?

来自分类Dev

C ++:移至unique_ptr

来自分类Dev

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

来自分类Dev

如何在C ++ shared_ptr中使用lambda作为删除器来创建对象缓存?

来自分类Dev

C ++入门5版。shared_ptr和关联容器

来自分类Dev

C ++入门手册第五版:表示整数序列的位集

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

C ++ shared_ptr和threadanitazer报告数据竞赛

来自分类Dev

shared_ptr C ++的双重删除错误

来自分类Dev

C ++ unique_ptr和多态

来自分类Dev

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

来自分类Dev

C ++-shared_ptr的数组

来自分类Dev

C ++使用shared_ptr安全删除事件对象有效负载

来自分类Dev

C ++将删除的函数std :: unique_ptr与基类一起使用

Related 相关文章

  1. 1

    在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

  2. 2

    C ++零规则:多态删除和unique_ptr行为

  3. 3

    C ++入门手册第5版:shared_ptr的删除器和unique_ptr的删除器之间的区别

  4. 4

    用unique_ptr和自定义删除器包装C代码

  5. 5

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  6. 6

    在C ++中的unique_ptr之间进行转换

  7. 7

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

  8. 8

    错误C2280:尝试引用已删除的函数(unique_ptr)

  9. 9

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

  10. 10

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

  11. 11

    在C ++ 11中,如何最好地在unique_ptr中为普通数组创建迭代器?

  12. 12

    C ++设置和shared_ptr

  13. 13

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

  14. 14

    C ++ 11使用unique_ptr和自定义删除器

  15. 15

    C ++入门5版:shared_ptr的容器

  16. 16

    C ++入门5版:从uniqe_ptr初始化了shared_ptr吗?

  17. 17

    C ++:移至unique_ptr

  18. 18

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

  19. 19

    如何在C ++ shared_ptr中使用lambda作为删除器来创建对象缓存?

  20. 20

    C ++入门5版。shared_ptr和关联容器

  21. 21

    C ++入门手册第五版:表示整数序列的位集

  22. 22

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  23. 23

    C ++ shared_ptr和threadanitazer报告数据竞赛

  24. 24

    shared_ptr C ++的双重删除错误

  25. 25

    C ++ unique_ptr和多态

  26. 26

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

  27. 27

    C ++-shared_ptr的数组

  28. 28

    C ++使用shared_ptr安全删除事件对象有效负载

  29. 29

    C ++将删除的函数std :: unique_ptr与基类一起使用

热门标签

归档