ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

unique_ptr

2021-06-09 13:03:09  阅读:142  来源: 互联网

标签:std ... auto 使用 unique ptr


目录

作用

​ 以的方式对堆内存进行独占管理

​ 占用空间大小和裸指针几乎相同,在调用指针函数的时候也和裸指针相同

​ 默认情况下,对于内裹指针是通过delete来释放内存的

通用的使用场景

  1. 自己写一个make_unique的

    比如make_unique
    template <typename T, typename ...Args>
    std::unique_ptr<T> make_unique(Args&& ...args) {
        return unique_ptr<T>( new T( std::forward<Args>(args)...));
    }
    
    1. 指定析构器的工厂
    using namespace std;
    
    auto del = [](int* ptr) {
        std::cout << "delInstanse is call" << std::endl;
        delete ptr;
    };
    
    template <typename ...Args>
    std::unique_ptr<int, decltype(del)> uniqueFactory(Args&& ...args) {
        return unique_ptr<int, decltype(del)> (new int(std::forward<Args>(args)...), del);
    }
    
    int main () {
      unique_ptr<int, decltype(del)> test(uniqueFactory());
      return 0;
    }
    

    当然uniqueFactory也可以加一个type参数,实现简单工厂,注意的是我将自定义析构器的类型指定为unique_ptr的第二个类型参数

注意点

1. unique_ptr的构造必须括号形式,不可以使用隐士,因为内部是explicit修饰的
2. 当出现unique_ptr<父类> = new 子类的时候,需要保证父类的析构函数是virtual的
3. 可以使用 unique_ptr 直接无缝 工厂/移动语义的方式赋值给shared_ptr,这也是为什么工厂函数使用unique_ptr是合适的

为什么使用unique_ptr替代auto_ptr

​ 本意就是想独占所有权,并且在需要的时候进行内部转移

​ auto_ptr使用将原来对象销毁置空的操作,而unique_ptr完全使用移动语义完美实现这一功能,还保证指针的独占性

​ auto_ptr无法使用容器包裹,unique_ptr使用移动构造完整这一目的

标签:std,...,auto,使用,unique,ptr
来源: https://www.cnblogs.com/chaohacker/p/14866439.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有