C++ unique_ptr
裸指针在使用的时候,需要手动new和delete,有时候忘记delete就会造成内存泄漏。
所以出现了智能指针,可以帮助我们去管理内存的删除操作。本文只讲unique_ptr的使用。
unique_ptr对象包装一个原始指针,并负责其生命周期。当该unique_ptr对象被销毁时,会在其析构函数中删除关联的原始指针。
创建方式
- 使用原始指针创建
std::unique_ptr<Person> pPerson1(new Person("P1"));
- 使用make_unique来创建
std::unique_ptr<Person> pPerson2 = std::make_unique<Person>("P2");
常用函数
get
用途:获取被管理的裸指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.get();
release
用途:释放其关联的原始指针的所有权,并返回原始指针,但是并未delete原始指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.release();
reset
用途:重置unique_ptr为空,并delete原始指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.reset();
函数使用场景
static std::vector<Person*> Persons;void AddPerson()
{auto a = std::make_unique<Person>("Px");Persons.push_back(a.get());
}int main()
{AddPerson();
}
在上面的代码段中,vector容器用来存放Persons类型的指针,执行了AddPerson之后,发现Persons中存放的都是野指针,先说正确的做法:
Persons.push_back(a.release());
那么两者有什么区别呢?
- get,即并没有释放对于指针a的所有权,unique_ptr仍然在管理指针a,所以出了函数AddPerson作用域之后,unique_ptr就会自动销毁指针a,那当然就变成野指针了。
- release,即交出了(也应该交出)对于指针a的所有权,交由后面的使用者管理,所以出了函数AddPerson作用域之后,指针a不会被删除
- 即使用了release,在Persons不再使用的时候,也不能忘记对vector内的每一个指针进行delete。
C++ unique_ptr相关推荐
- C++ 智能指针(unique_ptr / shared_ptr)代码实现
文章目录 unique_ptr 智能指针的实现 shared_ptr 智能指针的实现 指针类型转换 unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有. #inclu ...
- C++智能指针:unique_ptr详解
文章目录 unique_ptr描述 声明 作用 函数指针描述 总结 unique_ptr描述 声明 头文件:<memory> 模版类: 默认类型template <class T, ...
- 智能指针unique_ptr
unique_ptr的一些操作: int main() {unique_ptr<int> uptr(new int(10));//unique_ptr<int> uptr2(u ...
- 【Smart_Point】unique_ptr与shared_ptr使用实例
shared_ptr使用实例 文章目录 shared_ptr使用实例 unique_ptr使用实例 cv::fitLine中斜率为正无穷的情况,需要特殊考虑 std::string path = &q ...
- 【Smart_Point】unique_ptr中独占指针使用MakeFrame
1. DFrame使用方法 std::unique_ptr<deptrum::Frame> MakeFrame(deptrum::FrameType frame_type,int widt ...
- 【Smart_Point】C/C++ 中独占指针unique_ptr
1. 独占指针unique_ptr 目录 1. 独占指针unique_ptr 1.1 unique_ptr含义 1.2 C++11特性 1.3 C++14特性 1.1 unique_ptr含义 uni ...
- C++11中unique_ptr的使用
在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...
- C++——auto_ptr与unique_ptr
auto_ptr与unique_ptr的比较 先介绍unique_ptr(独占智能指针)参考爱编程的大丙 std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针 ...
- C++——智能指针——auto_ptr、shared_ptr、unique_ptr
1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...
- 理解smart pointer之三:unique_ptr
unique_ptr最先在boost中被定义,后来被C++标准委员会选中为C++11的feature之一. std::unique_ptr is a smart pointer that retain ...
最新文章
- 使用正则表达式进行高效的测试
- 《2019人工智能发展报告》!含计算机视觉、机器人等13个子领域(附链接)
- Activity采用栈式管理的理解
- IBM XIV高效存储广受公安、医疗、电信、金融等客户赞誉
- tomcat7.0 安装启动之后localhost:8080页面进不去,提示错误500
- 工作中让你提建议怎么办?
- SAS宏保存以便快速调用的三种解决方案(转载)
- 产品经理应该掌握的3种金融思维
- Java多线程的三种实现方式(重点看Collable接口实现方式)
- [笔记] 《Windows网络编程(第2版)》
- PCB屏蔽罩图纸制作
- FPGA数字钟项目总结
- iOS 第四天之ViewController
- 即时通讯IM技术领域提高篇
- 计算机怎么移动游戏,Uplay游戏怎么搬移 Uplay游戏搬移方法介绍
- 【数字】求特定三位数
- 【粉笔结构化面试】综合分析类
- 英语----非谓语动词done
- WIN10操作系统解决磁盘文件只读属性问题
- linux清除僵尸进程,Linux 下僵尸进程的清理方法