1.背景
动态内存的使用很容易出问题,确保在正确的时间释放内存是极其困难的。忘记释放内存时会产生内存泄露;当尚有指针引用内存的情况下释放它,会产生引用非法内存的指针。
智能指针能自动释放所指向的对象。新的标准库提供了两种智能指针:
(1)shared_ptr:基于引用计数,允许多个指针指向同一个对象;
(2)unique_ptr:拷贝构造与赋值不能使用,实现独占的智能指针;
另外还有一个weak_ptr 弱引用,指向shared_ptr所管理的对象。
2.shared_ptr
智能指针是模板,使用时需要指定类型:
(1) 基本的使用
shared_ptr<string> p1;
有效性判断:
//判断智能指针p1是否为空,已经字符串是否为空
if(p1 && p1->empty())
{
//do something
}
(2)更安全的使用方式
最安全的分配和使用动态内存的方法是调用:make_shared函数。当使用make_ptr时必须要指定对象类型:
shared_ptr<int> ptr_int = make_shared<int>(42);
使用make_shared的优势:共享指针管理对象本身,以及包含引用计数和其他管家数据的小对象。
- make_shared可以分配单个内存块来保存这两个内存; 从指向已分配对象的指针构造共享指针将需要分配第二个块来存储引用计数,效率较高。
- 使用make_shared意味着您根本不需要处理new和原始指针,从而提供更好的异常安全性,在分配对象之后但在将其分配给智能指针之前不可能抛出异常。
(3)shared_ptr和new结合使用
接受指针参数的智能指针构造函数是explicit的,不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式来初始化:
shared_ptr<int> p1 = new int(1024); //错误:必须使用直接初始化形式
shared_ptr<int> p2(new int(1024)); //正确
- 不要混合使用普通指针和智能指针;
- 不要使用get初始化另外一个智能指针或为智能指针赋值;