最近看了C++ prime plus第六版的智能指针部分(667页16.2),记录以下笔记。
智能指针的作用
在使用动态内存分配的时候,我们可能会因为忘了释放掉不再使用的内存,导致内存泄漏。
如果指针是一个对象,就可以在对象过期时,让析构函数释放内存,这就是智能指针auto_ptr、unique_ptr、shared_ptr背后的思想。
智能指针可以将基本类型指针封装为类对象指针,并在析构函数里编写delete语句删除指针指向的内存空间。最终在其所指向的对象不再被使用之后,会自动释放与对象相关的资源。
四个智能指针
C++98:auto_ptr
C++11:shared_ptr, weak_ptr, unique_ptr
头文件
智能指针的头文件为memory
使用示例
所有的智能指针类都有一个explicit构造函数,以指针作为参数。比如auto_ptr的类模板原型为:
templet<class T>
class auto_ptr {
explicit auto_ptr(X* p = 0) ;
...
};
可以采用以下两种方法来调用智能指针的构造函数完成初始化:
#include <bits/stdc++.h>
using namespace std;
int main(){
//法1、直接新创建一个指针
auto_ptr<int> p(new int(2));
cout<<*p.get(); //get函数返回指针
//法2、用arr指针来初始化智能指针
int *arr=new int(2);
unique_ptr<int> p1(arr);
cout<<*p1.get();
}
运行结果:22
需要注意不要用非堆内存的指针来进行初始化,会导致错误。
三种智能指针的区别
C++ prime plus介绍了auto_ptr、unique_ptr、shared_ptr三种智能指针的区别。
先看下面代码:
auto_ptr< string> ps (new string ("I reigned lonely as a cloud.”);
auto_ptr<string> vocation;
vocaticn = ps;
上述赋值语句将完成什么工作呢?如果ps和vocation是常规指针,则两个指针将指向同一个string对象。这是不能接受的,因为程序将试图删除同一个对象两次——一次是ps过期时,另一次是vocation过期时。要避免这种问题,方法有多种:
- 定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费