精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
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