shared_ptr 是一个最像指针的“智能指针”,是boost/smart_ptr库中最有价值,最重要的组成部分,也是最有用的。boost库中的许多重要组件,甚至其它领域的智能指针都使用了shared_ptr,比如C++11里的shared_ptr就是参考boost库里的shared_ptr实现的。
shared_ptr的原理
shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。所以shared_ptr也叫做引用计数型智能指针。
- shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
- 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
- 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
- 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指
针了。
shared_ptr的简单使用
#include <iostream>
#include <memory>
#include <boost/smart_ptr.hpp>
using namespace boost;
using namespace std;
int main()
{
//每多一个对象指向p空间,引用计数就加一,对象析构则引用计数减一。引用计数为0时才允许释放p空间
int* p = new int(10);
//shared_ptr 共享智能指针,也叫引用计数型智能指针
std::shared_ptr<int> sp;
//cout << "*sp = " << *sp << endl;
cout << "use_count = " << sp.use_count() << endl;
//std::shared_ptr<int> sp1 = sp; //允许拷贝构造
//cout << "use_count = " << sp1.use_count() << endl;
//std::shared_ptr<int> sp2;
//sp2 = sp1; //允许赋值
//cout << "use_count = " << sp2.use_count() << endl;
sp.reset(p); //重新设置
cout << "*sp = " << *sp << endl;
cout << "use_count = " << sp.use_count() << endl;
if (sp.unique()) //判断sp是否是唯一管理p空间的智能指针
cout << "is unique." << endl;
else
cout << "is not unique." << endl;
//weak_ptr(弱指针)是为配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手而不是智能指针,
//因为它不具有普通指针的行为,没有重载operator*和->
//它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。
std::weak_ptr<int> wp = sp;
cout << "use_count = " << sp.use_count() << endl; //引用计数不会加一
cout << "wp_use_count = " << wp.use_count() << endl;
return 0;
}
shared_ptr的定制删除器
如果不是new出来的对象而是一块数组空间,如何通过智能指针管理呢?其实shared_ptr设计了一个删除器来解决这个问题,简单代码如下:
void Del(listNode* pn)
{
cout << "Delete pn" << endl;
delete[] pn;
}
int main()
{
int* pa = new int[5]{1,2,3,4,5};
//boost::shared_array<int> spa(pa); //OK
/*
C++11库里没有所谓的shared_array,但boost库里有,但若仍想利用std::shared_ptr管理数组空间,
则需要定制删除器,其实就是删除函数
*/
//std::shared_ptr<int> spa(pa); //error
std::shared_ptr<int> spa(pa,Del); //OK
return 0;
}