锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源 / unique_ptr用途和make_unique创建unique_ptr实例对象
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容


unique_ptr用途和make_unique创建unique_ptr实例对象


unique_ptr用于代替auto_ptr,它是智能指针,实现智能释放内存,可以用于局部变量、成员变量、函数返回值和全局变量。使用unique_ptr时不考虑内存区拥有权转换的事,用法固定,但是更安全。

在httplib里,有一段代码是结合function匿名函数进行初始化unique_ptr实例,比较有意思,分享一下:

  std::function<TaskQueue *(void)> new_task_queue;//定义成员

//类构造函数里用匿名函数初始化成员,匿名函数里是new语句,用new分配指针给unique_ptr构造函数是支持的。
new_task_queue(
          [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); })

std::unique_ptr<TaskQueue> task_queue(new_task_queue());//unique_ptr定义语句

task_queue在代码块结束}执行到时,它封装的内存就会自动释放,节省了程序员精力。

C++17标准和MSDN推荐用make_unique来创建uqinue_ptr实例对象,如下代码:

       compressor = detail::make_unique<detail::brotli_compressor>();

<和>之间是类型,()是构造函数,里面没有参数。还有复杂的形式:

    unique_ptr<Animal> p1 = make_unique<Animal>();

    // 使用多参数构造函数构造对象
    auto p2 = make_unique<Animal>(L"Felis", L"Catus", 12, 16.5);

    // 创建长度5的数组
    unique_ptr<Animal[]> p3 = make_unique<Animal[]>(5);

    // 数组里的项初始化
    p3[0] = Animal(L"Rattus", L"norvegicus", 3, 2.1);
    p3[1] = Animal(L"Corynorhinus", L"townsendii", 4, 1.08);

    // auto p4 = p2; //C2280,前面说了unique_ptr不涉及内存区拥有权的转移,强制转移就有C2280编译错误,可以使用std::move代替就没有错误了

    vector<unique_ptr<Animal>> vec;
    // vec.push_back(p2); //C2280,数组也不能直接添加unique_ptr
    // vector<unique_ptr<Animal>> vec2 = vec; // C2280
友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近