介绍:
- shared_ptr允许多个指针指向同一个对象,对象内存的释放交由智能指针自动释放。
- shared_ptr维护者一个关联计数器,称为引用计数
- 当对一个shared_ptr进行拷贝时,引用计数会加1;当对一个shared_ptr赋予一个新值或shared_ptr被销毁(局部的智能指针变量被销毁)时,引用计数减1
- 当引用计数为0时,会自动调用delete或自定义内存释放函数释放内存
- 释放内存时会调用对象的析构函数
- 引入头文件:#include< memory>
1. 默认构造方式
- shared_ptr< T> sp;
- 默认初始化的智能指针保存的是一个空指针
- 智能指针的使用方式和普通指针类似;解引用一个智能指针放回它指向的对象。
示例:
shared_ptr<int> p1; // 指向int的智能指针,默认初始化为空指针
shared_ptr<string> p2; // 指向string的智能指针,默认初始化为空指针
2. 其他构造方式
默认构造方式只能得到一个空的智能指针,shared_ptr提供了多种其他的构造方式,包括:使用make_shared函数、拷贝构造、与new结合使用。
(1)make_shared函数
- 使用make_shared函数初始化一个智能指针是最安全的分配和使用动态内存的方法
- 使用时必须指定要创建对象的类型
- make_shared(args):返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象
- args要与T类型中的某个构造函数相匹配,make_shared初始化是会调用该类型的对应构造函数;若args为空,则对象进行值初始化
shared_ptr<int> p1 = make_shared<int>(4); //指向一个int的值为4的shared_ptr
shared_ptr<string> p2 = make_shared<string>(4, 's'); // 会调用string(4, 's'),p2指向一个值为"ssss"的string对象
shared_ptr<int> p3 = make_shared<int>(