unique_ptr的使用和陷阱
来源:互联网 发布:淘宝店铺流量分析软件 编辑:程序博客网 时间:2024/06/10 18:20
unique_ptr的使用
分配内存
与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式。
unique_ptr<int> up1(new int()); //okay,直接初始化unique_ptr<int> up2 = new int(); //error! 构造函数是explicitunique_ptr<int> up3(up1); //error! 不允许拷贝
不可 拷贝和赋值
与shared_ptr不同,unique_ptr拥有它所指向的对象,在某一时刻,只能有一个unique_ptr指向特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。因此不允许多个unique_ptr指向同一个对象,所以不允许拷贝与赋值。
unique_ptr的操作
unique_ptr<T> up
空的unique_ptr,可以指向类型为T的对象,默认使用delete来释放内存unique_ptr<T,D> up(d)
空的unique_ptr同上,接受一个D类型的删除器d,使用删除器d来释放内存up = nullptr
释放up指向的对象,将up置为空up.release()
up放弃对它所指对象的控制权,并返回保存的指针,将up置为空,不会释放内存up.reset(…)
参数可以为 空、内置指针,先将up所指对象释放,然后重置up的值
传递unique_ptr参数和返回unique_ptr
前面说了unique_ptr不可拷贝和赋值,那要怎样传递unique_ptr参数和返回unique_ptr呢?
事实上
不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr (C++ Primer 5th p418)
//从函数返回一个unique_ptrunique_ptr func1(int a){ return unique_ptr<int> (new int(a));}//返回一个局部对象的拷贝unique_ptr func2(int a){ unique_ptr<int> up(new int(a)); return up;}
传unique_ptr参数可以使用引用避免所有权的转移,或者暂时的移交所有权
void func1(unique_ptr<int> &up){ cout<<*up<<endl;}unique_ptr<int> func2(unique_ptr<int> up){ cout<<*up<<endl; return up;}//使用up作为参数unique_ptr<int> up(new int(10));//传引用,不拷贝,不涉及所有权的转移func1(up);//暂时转移所有权,函数结束时返回拷贝,重新收回所有权up = func2(unique_ptr<int> (up.release()));//如果不用up重新接受func2的返回值,这块内存就泄漏了
向unique_ptr传递删除器
类似shared_ptr,用unique_ptr管理非new对象、没有析构函数的类时,需要向unique_ptr传递一个删除器。不同的是,unique_ptr管理删除器的方式,我们必须在尖括号中unique_ptr指向类型后面提供删除器的类型,在创建或reset一个这种unique_ptr对象时,必须提供一个相同类型的可调用对象(删除器),这个删除器接受一个T*参数。
unique_ptr的陷阱
不要与裸指针混用
unique_ptr不允许两个独占指针指向同一个对象,在没有裸指针的情况下,我们只能用release获取内存的地址,同时放弃对对象的所有权,这样就有效避免了多个独占指针同时指向一个对象。
而使用裸指针就很容器打破这一点
int *x(new int());unique_ptr<int> up1,up2;//会使up1 up2指向同一个内存up1.reset(x);up2.reset(x);
要避免写这样的程序
记得使用u.release()的返回值
在调用u.release()时是不会释放u所指的内存的,这时返回值就是对这块内存的唯一索引,如果没有使用这个返回值释放内存或是保存起来,这块内存就泄漏了
- unique_ptr的使用和陷阱
- unique_ptr的使用和陷阱
- VC++ unique_ptr的使用例子
- shared_ptr的使用和陷阱
- shared_ptr的使用和陷阱
- C++11中unique_ptr的使用
- std::unique_ptr和std::shared_ptr的用法
- reduce() 和 findContours()的使用陷阱 .
- C++11中使用shared_ptr和unique_ptr管理动态数组
- unique_ptr使用简介
- unique_ptr使用简介
- unique_ptr和weak_ptr
- boost :: scoped_ptr的和std ::的unique_ptr的区别
- 使用unique_ptr代替C风格数组的一个例子
- [C++11]_[初级]_[unique_ptr的使用场景]
- 关于shared_ptr模板和unique_ptr模板的实现
- C++ 11 的 unique_ptr
- unique_ptr的一个实现
- 【求解】一个很有意思的意外:font-awesome出现奇怪符号
- ASM下载地址
- [LeetCode] 595.Big Countries
- javaBean是什么
- Java 8 习惯用语,第 2 部分 函数组合与集合管道模式
- unique_ptr的使用和陷阱
- 线程分离状态
- 【深度干货】2017年深度学习优化算法研究亮点最新综述(附slide下载)
- mysql5.7官网直译优化和索引--B树索引和哈希索引的对比
- 沸腾!阿里又开源了一项自研核心技术!
- 文件上传的思路
- C/C++ Windows移植到Linux兼容库移植
- [译]对design库中AppBarLayout嵌套滚动问题的修复
- Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换