裸指针在使用的时候,需要手动new和delete,有时候忘记delete就会造成内存泄漏。
所以出现了智能指针,可以帮助我们去管理内存的删除操作。本文只讲unique_ptr的使用。
unique_ptr对象包装一个原始指针,并负责其生命周期。当该unique_ptr对象被销毁时,会在其析构函数中删除关联的原始指针。

创建方式

  1. 使用原始指针创建
std::unique_ptr<Person> pPerson1(new Person("P1"));
  1. 使用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());

那么两者有什么区别呢?

  1. get,即并没有释放对于指针a的所有权,unique_ptr仍然在管理指针a,所以出了函数AddPerson作用域之后,unique_ptr就会自动销毁指针a,那当然就变成野指针了。
  2. release,即交出了(也应该交出)对于指针a的所有权,交由后面的使用者管理,所以出了函数AddPerson作用域之后,指针a不会被删除
  3. 即使用了release,在Persons不再使用的时候,也不能忘记对vector内的每一个指针进行delete。

C++ unique_ptr相关推荐

  1. C++ 智能指针(unique_ptr / shared_ptr)代码实现

    文章目录 unique_ptr 智能指针的实现 shared_ptr 智能指针的实现 指针类型转换 unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有. #inclu ...

  2. C++智能指针:unique_ptr详解

    文章目录 unique_ptr描述 声明 作用 函数指针描述 总结 unique_ptr描述 声明 头文件:<memory> 模版类: 默认类型template <class T, ...

  3. 智能指针unique_ptr

    unique_ptr的一些操作: int main() {unique_ptr<int> uptr(new int(10));//unique_ptr<int> uptr2(u ...

  4. 【Smart_Point】unique_ptr与shared_ptr使用实例

    shared_ptr使用实例 文章目录 shared_ptr使用实例 unique_ptr使用实例 cv::fitLine中斜率为正无穷的情况,需要特殊考虑 std::string path = &q ...

  5. 【Smart_Point】unique_ptr中独占指针使用MakeFrame

    1. DFrame使用方法 std::unique_ptr<deptrum::Frame> MakeFrame(deptrum::FrameType frame_type,int widt ...

  6. 【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 ...

  7. C++11中unique_ptr的使用

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

  8. C++——auto_ptr与unique_ptr

    auto_ptr与unique_ptr的比较 先介绍unique_ptr(独占智能指针)参考爱编程的大丙 std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针 ...

  9. C++——智能指针——auto_ptr、shared_ptr、unique_ptr

    1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...

  10. 理解smart pointer之三:unique_ptr

    unique_ptr最先在boost中被定义,后来被C++标准委员会选中为C++11的feature之一. std::unique_ptr is a smart pointer that retain ...

最新文章

  1. 使用正则表达式进行高效的测试
  2. 《2019人工智能发展报告》!含计算机视觉、机器人等13个子领域(附链接)
  3. Activity采用栈式管理的理解
  4. IBM XIV高效存储广受公安、医疗、电信、金融等客户赞誉
  5. tomcat7.0 安装启动之后localhost:8080页面进不去,提示错误500
  6. 工作中让你提建议怎么办?
  7. SAS宏保存以便快速调用的三种解决方案(转载)
  8. 产品经理应该掌握的3种金融思维
  9. Java多线程的三种实现方式(重点看Collable接口实现方式)
  10. [笔记] 《Windows网络编程(第2版)》
  11. PCB屏蔽罩图纸制作
  12. FPGA数字钟项目总结
  13. iOS 第四天之ViewController
  14. 即时通讯IM技术领域提高篇
  15. 计算机怎么移动游戏,Uplay游戏怎么搬移 Uplay游戏搬移方法介绍
  16. 【数字】求特定三位数
  17. 【粉笔结构化面试】综合分析类
  18. 英语----非谓语动词done
  19. WIN10操作系统解决磁盘文件只读属性问题
  20. linux清除僵尸进程,Linux 下僵尸进程的清理方法

热门文章

  1. 即拿即用-Android多线程断点下载
  2. VirtualBox 共享文件夹失败
  3. JavaScript常用知识点笔记
  4. 常见的定位技术主要有哪些?
  5. 织梦dede如何让channelartlist标签支持currentstyle属性
  6. [转载] 全本张广泰——第二十三回 红玉盗马褂 全家喜团聚
  7. 华章IT图书书讯(2012年第8期)
  8. 哀悼日-网站置为灰色
  9. 《iOS 核心动画高级技巧》笔记
  10. Linux FTP并发连接及带宽限制