• c++11 智能指针-辅助类 (std::bad_weak_ptr)


    定义于头文件

    访问指向已销毁对象的 weak_ptr 时抛出的异常

    class bad_weak_ptr;  (C++11 起) 

    std::bad_weak_ptr 是 std::shared_ptr 以 std::weak_ptr 为参数的构造函数,在 std::weak_ptr 指代已被删除的对象时,作为异常抛出的对象类型。 

    成员函数

    (构造函数)

    构造 bad_weak_ptr 对象
    (公开成员函数)

    std::bad_weak_ptr::bad_weak_ptr

    bad_weak_ptr() noexcept;

    构造 std::bad_weak_ptr 的新实例。 what() 返回实现定义的空终止字节字符串。

    参数

    (无)

    继承自 std::exception

    成员函数

    (析构函数)

    [虚]

    析构该异常对象
    (std::exception 的虚公开成员函数)

    what

    [虚]

    返回解释性字符串
    (std::exception 的虚公开成员函数)

     调用示例

    1. #include <memory>
    2. #include <iostream>
    3. int main()
    4. {
    5. std::shared_ptr<int> p1(new int(42));
    6. std::weak_ptr<int> wp(p1);
    7. p1.reset();
    8. try
    9. {
    10. std::shared_ptr<int> p2(wp);
    11. }
    12. catch (const std::bad_weak_ptr& e)
    13. {
    14. std::cout << e.what() << '\n';
    15. }
    16. }

    输出

     

    unique_ptr 的默认删除器

    std::default_delete

    template< class T > struct default_delete;

    (1)(C++11 起)

    template< class T > struct default_delete;

    (2)(C++11 起)

    std::default_delete 是不指定删除器时 std::unique_ptr 所用的默认删除策略。

    1) 非特化的 default_delete 用 delete 解分配单个对象的内存。

    2) 亦为提供数组类型的使用 delete[] 的部分特化。

    成员函数

    (构造函数)

    构造 default_delete 对象
    (公开成员函数)

    operator()

    删除对象或数组
    (公开成员函数)

     

    std::default_delete::default_delete

    constexpr default_delete() noexcept = default;

    (1)

    template
    default_delete( const default_delete& d ) noexcept;

    (2)(仅为初等 default_delete 模板的成员)

    template
    default_delete( const default_delete& d) noexcept;

    (3)(C++17 起)
    (仅为数组 default_delete 特化的成员)

    1) 构造 std::default_delete 对象。

    2) 从另一 std::default_delete 构造 std::default_delete 对象。此构造函数仅若 U* 可隐式转换为 T* 才参与重载决议。

    3) 从另一 std::default_delete 对象构造 std::default_delete 对象。此构造函数仅若 U(*)[] 可隐式转换为 T(*)[] 才参与重载决议。

    参数

    d-复制来源的删除器

    注意

    std::default_delete 的转换构造函数模板令从 std::unique_ptr 到 std::unique_ptr 的隐式转换可行。

    std::default_delete::operator()

    void operator()(T* ptr) const;

    (1)(C++17 起,不再是 default_delete 模板特化的成员)

    template
    void operator()(U* ptr) const;

    (2)(仅为 default_delete 模板特化的成员,但 C++17 前定义为被删除)

    1) 在 ptr 上调用 delete (初等模板)或 delete[] (数组特化)。

    2) 定义为被删除。

    (C++17 前)

    1) 在 ptr 上调用 delete

    2) 在 ptr 上调用 delete[] 。此函数仅若 U(*)[] 能隐式转换为 T(*)[] 才参与重载决议。

    (C++17 起)

    任何情况下,若 U 是不完整类型,则程序为病式。

    参数

    ptr-要删除的对象或数组

    异常

    无异常保证。

    在不完整类型上调用

    于代码中调用 operator() 点,类型必须完整。一些实现中用 static_assert 确保如此。此要求的原因,是 C++ 中若完整类类型拥有非平凡析构函数或解分配函数,则在不完整类型上调用 delete 是未定义行为,因为编译器无法得知这种函数是否存在且必须被调用。

    调用示例

    1. #include <memory>
    2. #include <vector>
    3. #include <algorithm>
    4. int main()
    5. {
    6. // {
    7. // std::shared_ptr<int> shared_bad(new int[10]);
    8. // } // 析构函数调用 delete ,未定义行为
    9. {
    10. std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>
    11. ());
    12. } // 析构函数调用 delete[] , ok
    13. {
    14. std::unique_ptr<int> ptr(new int(5));
    15. } // unique_ptr<int> 使用 default_delete<int>
    16. {
    17. std::unique_ptr<int[]> ptr(new int[10]);
    18. } // unique_ptr<int[]> 使用 default_delete<int[]>
    19. // default_delete 能用于需要删除用函数对象的任何场所
    20. std::vector<int*> v;
    21. for (int n = 0; n < 100; ++n)
    22. {
    23. v.push_back(new int(n));
    24. }
    25. std::for_each(v.begin(), v.end(), std::default_delete<int>());
    26. }

     

  • 相关阅读:
    Docker快速入门
    视频拉流推流技术梳理
    (三十二)大数据实战——Maxwell安装部署及其应用案例实战
    HTML简单介绍
    Nginx配置文件详解
    nodejs+vue+elementui餐厅点餐系统
    企业应用超融合架构的设计实例及超融合应用场景分析
    HTML网页设计结课作业 web课程设计网页规划与设计 网页设计成品DW静态网页 Web大学生网页成品 web网页设计期末课程大作业
    云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群
    认识操作系统 | 理解管理 | 系统调用(System Call)
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/126797624