• c++11 智能指针 (std::unique_ptr)(二)


    定义于头文件 
    1. template< class T, class Deleter = std::default_delete<T>>
    2. class unique_ptr; (1) (C++11 起)
    3. template < class T,class Deleter>
    4. class unique_ptr<T[], Deleter>; (2) (C++11 起)

    析构函数

    std::unique_ptr<T,Deleter>::~unique_ptr
    ~unique_ptr();        (C++11 起) 

    get() == nullptr 则无效果。否则,通过 get_deleter()(get()) 销毁占有的对象。

    要求 get_deleter()(get()) 不抛异常。

    注意

    即使拥有默认删除器的 std::unique_ptr 能以不完整类型 T 构造,在调用析构函数的代码位置, T 必须完整。

    调用示例

    1. #include <iostream>
    2. #include <memory>
    3. int main()
    4. {
    5. auto deleter = [](int* ptr)
    6. {
    7. std::cout << "[deleter called]\n";
    8. delete ptr;
    9. };
    10. std::unique_ptr<int, decltype(deleter)> uniq(new int, deleter);
    11. std::cout << (uniq ? "not empty\n" : "empty\n");
    12. uniq.reset();
    13. std::cout << (uniq ? "not empty\n" : "empty\n");
    14. }

    输出

     

    unique_ptr赋值

    std::unique_ptr<T,Deleter>::operator=

    初等模板 unique_ptr 的成员

    1. unique_ptr& operator=( unique_ptr&& r ) noexcept; (1)
    2. template< class U, class E >
    3. unique_ptr& operator=( unique_ptr<U,E>&& r ) noexcept; (1)
    4. unique_ptr& operator=( nullptr_t ) noexcept; (2)

    数组特化 unique_ptr 的成员

    1. unique_ptr& operator=( unique_ptr&& r ) noexcept; (1)
    2. template< class U, class E >
    3. unique_ptr& operator=( unique_ptr<U,E>&& r ) noexcept; (1) (C++17 起)
    4. unique_ptr& operator=( nullptr_t ) noexcept; (2)

    1) 从 r 转移所有权到 *this ,如同以调用 reset(r.release()) 后随从 get_deleter() 到 std::forward(r.get_deleter()) 的赋值。

    Deleter 不是引用类型,则要求它为不抛出可移动赋值 (MoveAssignable) 。
    Deleter 是引用类型,则要求 std::remove_reference::type 为不抛出可复制赋值 (CopyAssignable) 。
    赋值运算符的非模板版本仅若 std::is_move_assignable::value 为 true 才参与重载决议。
    此赋值运算符的模板版本仅若 U 非数组类型且 unique_ptr::pointer 可隐式转换为 pointer 且 std::is_assignable::value 为 true (C++17 起)才参与重载决议。

    数组的特化 std::unique_ptr 中,此赋值运算符的模板版本表现与初等模板中相同,除了仅若下列皆为真才参与重载决议:

    • U 是数组类型
    • pointerelement_type* 是同一类型
    • unique_ptr::pointerunique_ptr::element_type* 是同一类型
    • unique_ptr::element_type(*)[] 可转换为 element_type(*)[]
    • std::is_assignable::value 为 true
    (C++17 起)

    2) 与调用 reset() 等效。

    注意 unique_ptr 的赋值运算符只接受典型地由 std::move 生成的右值。( unique_ptr 类显式删除其左值复制构造函数和左值赋值运算符。)

    参数

    r-所有权将被转移的智能指针

    返回值

    *this

    调用示例

    1. #include <iostream>
    2. #include <memory>
    3. struct Foo
    4. {
    5. Foo()
    6. {
    7. std::cout << "Foo\n";
    8. }
    9. ~Foo()
    10. {
    11. std::cout << "~Foo\n";
    12. }
    13. };
    14. int main()
    15. {
    16. std::unique_ptr<Foo> p1;
    17. {
    18. std::cout << "Creating new Foo...\n";
    19. std::unique_ptr<Foo> p2(new Foo());
    20. // p1 = p2; // 错误!不能复制 unique_ptr
    21. p1 = std::move(p2);
    22. std::cout << "About to leave inner block...\n";
    23. // Foo 实例将继续生存,尽管 p2 离开作用域
    24. }
    25. std::cout << "About to leave program...\n";
    26. }

    输出

     

  • 相关阅读:
    恶劣条件下GNSS定位的鲁棒统计
    【跟小嘉学 Rust 编程】二十八、Rust中的日期与时间(DateTime)
    第十二章 控制值的转换
    虚拟机配置spark
    在线代码编辑器CodePen和CodeSandbox
    1. 内核镜像组成及编译
    如何解决requests库自动确定认证arded 类型
    常见的数学物理方程
    csv和excel文件操作
    About 11.13 This Week
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/126687615