• C++ unique_ptr


    裸指针在使用的时候,需要手动new和delete,有时候忘记delete就会造成内存泄漏。
    所以出现了智能指针,可以帮助我们去管理内存的删除操作。本文只讲unique_ptr的使用。
    unique_ptr对象包装一个原始指针,并负责其生命周期。当该unique_ptr对象被销毁时,会在其析构函数中删除关联的原始指针。

    创建方式

    1. 使用原始指针创建
    std::unique_ptr<Person> pPerson1(new Person("P1"));
    
    • 1
    1. 使用make_unique来创建
    std::unique_ptr<Person> pPerson2 = std::make_unique<Person>("P2");
    
    • 1

    常用函数

    get

    用途:获取被管理的裸指针。

    std::unique_ptr<Person> pPerson2(new Person("P2"));
    Person* pRaw2 = pPerson2.get();
    
    • 1
    • 2

    release

    用途:释放其关联的原始指针的所有权,并返回原始指针,但是并未delete原始指针。

    std::unique_ptr<Person> pPerson2(new Person("P2"));
    Person* pRaw2 = pPerson2.release();
    
    • 1
    • 2

    reset

    用途:重置unique_ptr为空,并delete原始指针。

    std::unique_ptr<Person> pPerson2(new Person("P2"));
    Person* pRaw2 = pPerson2.reset();
    
    • 1
    • 2

    函数使用场景

    static std::vector<Person*> Persons;
    
    void AddPerson()
    {
        auto a = std::make_unique<Person>("Px");
        Persons.push_back(a.get());
    }
    
    int main()
    {
        AddPerson();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上面的代码段中,vector容器用来存放Persons类型的指针,执行了AddPerson之后,发现Persons中存放的都是野指针,先说正确的做法:

    Persons.push_back(a.release());
    
    • 1

    那么两者有什么区别呢?

    1. get,即并没有释放对于指针a的所有权,unique_ptr仍然在管理指针a,所以出了函数AddPerson作用域之后,unique_ptr就会自动销毁指针a,那当然就变成野指针了。
    2. release,即交出了(也应该交出)对于指针a的所有权,交由后面的使用者管理,所以出了函数AddPerson作用域之后,指针a不会被删除
    3. 即使用了release,在Persons不再使用的时候,也不能忘记对vector内的每一个指针进行delete。
  • 相关阅读:
    爬虫入门篇
    vue.js样式绑定03(源代码)
    H3C交换机如何配置SSH服务
    广西螺蛳粉:“超级农货”养成记
    代码随想录算法训练营第六十天| 739. 每日温度、 496.下一个更大元素 I
    企业如何利用人工智能推动可持续发展
    银河麒麟 linux V10 安装JDK
    jvm性能调优实战 - 61常用的JVM调优网站
    Stable Diffusion之novel Ai教程,小白必经之路
    react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善
  • 原文地址:https://blog.csdn.net/niaxiapia/article/details/125530820