zoukankan      html  css  js  c++  java
  • unique_ptr

    std::unique_ptr实现了独享所有权的语义。
    一个非空的std::unique_ptr总是拥有它所指向的资源。
    转移一个std::unique_ptr将会把所有权也从源指针转移给目标指针(源指针被置空)。
    std::unique_ptr不允许拷贝,std::unique_ptr仅能移动。
    当指针析构时,它所拥有的资源也被销毁。
    默认情况下,资源的析构是伴随着调用std::unique_ptr内部的原始指针的delete操作的。
    #include <cstdio>
    #include <iostream>
    #include <memory>
    using namespace std;
    
    struct Father : public std::enable_shared_from_this<Father>
    {
        string name;
    };
    
    unique_ptr<Father> clone()
    {
        unique_ptr<Father> ptr(new Father());
        //可作为返回值
        return ptr;   
    }
    
    int main()
    {
        //创建
        unique_ptr<Father> fa(new Father());
    
        //禁止拷贝
        //unique_ptr<Father> fa2(fa);    // 报错
    
        // 转移所有权
        unique_ptr<Father> fa3 = std::move(fa);   
    
        //可作为返回值
        unique_ptr<Father> fa4 = clone();
        return 0;
    }

    unique_ptr使用场景

    1、为动态申请的资源提供异常安全保证
    void Func()
    {
        int *p = new int(5);
        // ...(可能会抛出异常)
        delete p;
    }
    当我们动态申请内存后,有可能我们接下来的代码由于抛出异常或者提前退出(if语句)而没有执行delete操作。
    2、返回函数内动态申请资源的所有权
    unique_ptr<int> Func(int p)
    {
        unique_ptr<int> pInt(new int(p));
        return pInt;    // 返回unique_ptr
    }
    int main() 
    {
        int p = 5;
        unique_ptr<int> ret = Func(p);
        cout << *ret << endl;
        // 函数结束后,自动释放资源
    }
    3、在容器中保存指针
    int main() 
    {
        vector<unique_ptr<int>> vec;
        unique_ptr<int> p(new int(5));
        vec.push_back(std::move(p));    // 使用移动语义
    }
    4、管理动态数组
    int main() 
    {
        unique_ptr<int[]> p(new int[5] {1, 2, 3, 4, 5});
        p[0] = 0;   // 重载了operator[]
    }
  • 相关阅读:
    ArrayList与LinkedList区别
    ArrayList底层原理
    nginx启用https访问
    云服务器搭建 Nginx 静态网站
    在云服务器上(CentOS)上安装Node
    文本超出显示省略号CSS
    vue使用改变element-ui主题色
    vue中的select框的值动态绑定
    vue项目对axios的全局配置
    使用crypto-js对数据进行AES加密、解密
  • 原文地址:https://www.cnblogs.com/osbreak/p/9210152.html
Copyright © 2011-2022 走看看