智能指针(一)初识

一、为什么要使用智能指针?

1.1 动态内存和使用原因

程序使用内存大概可以分为“堆栈全常代”[1],和智能指针相关的是堆区,堆(heap)在C++中也被称为自由空间。自由空间的“自由”应该理解为程序员自己编写的自主控制其生命周期的空间,申请的空间大小相对宽裕[2]。

出于三个原因要使用动态内存

  • 程序不知道自己要使用多少对象。容器
  • 程序不知道所需对象的准确类型。多态
  • 程序需要在多个对象间共享数据。应用

除此,智能指针是异常安全的。即异常退出也会成功释放对应内存。

1.2 管理动态内存的方法

C++可以使用new和delete完成对动态内存的申请和释放,在程序中程序员负责对其进行申请和释放。这种方式容易出现“内存泄漏”、“多次释放同一空间”等问题,前者忘记释放,后者无意中多次释放。为了减少这种管理动态内存上的困难,智能指针就出现了!C++有四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用[3]。

二、智能指针声明和使用

智能指针的头文件位于memory头文件中。根据智能指针对动态内存的控制权力是共享还是独占分为两类,shared_ptr和unique_ptr。

shared_ptr<T> ssp=make_shared<T>(args);//make_shared最佳初始化共享指针方法
unique_ptr<T> usp(new T);//独占指针则没有make_shared,接受一个new对象返回的指针

允许多个符合类型要求的shared_ptr指向同一动态内存,独占指针管理一个动态内存时,具有排他性,在编译阶段任何第二个尝试指向该同一块内存的都将会编译失败[4]。

[1] 堆区,栈区,全局(静态)区,常量区和代码区。
[2] 关于栈、堆、静态存储区最大可分配大小的探讨. https://blog.csdn.net/lwnylslwnyls/article/details/8554613
[3] 详解C++11智能指针.https://www.cnblogs.com/WindSun/p/11444429.html
[4] auto_ptr没有管理好拷贝操作,会导致多次释放内存,因此在unique_ptr将拷贝禁止了。但是临时右值和std::move可以实现类似于“拷贝的操作”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章