C++11 -- shared_ptr 共享智能指针

shared_ptr 是一个最像指针的“智能指针”,是boost/smart_ptr库中最有价值,最重要的组成部分,也是最有用的。boost库中的许多重要组件,甚至其它领域的智能指针都使用了shared_ptr,比如C++11里的shared_ptr就是参考boost库里的shared_ptr实现的。

shared_ptr的原理

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。所以shared_ptr也叫做引用计数型智能指针。

  1. shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
  2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
  3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
  4. 如果不是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设计了一个删除器来解决这个问题,简单代码如下:

struct listNode
{
    
    
	int data;
	std::weak_ptr<listNode> prev;//使用weak_ptr是因为它不会增加prev和next的引用计数,避免造成循环引用
	std::weak_ptr<listNode> next;

	listNode(int d = 0) : data(d)
	{
    
    
		cout << "listNode::listNode()" << endl;
	}
	~listNode()
	{
    
    
		cout << "listNode::~listNode()" << endl;
	}
};
void Del(listNode* pn)
{
    
    
	cout << "Delete pn" << endl;
	delete[] pn;
}
int main()
{
    
    
	listNode* pa = new listNode[5];
	
	//boost::shared_array<listNode> spa(pa);  //OK

	/*
		C++11库里没有所谓的shared_array,但boost库里有,但若仍想利用std::shared_ptr管理数组空间,
		则需要定制删除器,其实就是删除函数
	*/
	//std::shared_ptr<listNode> spa(pa);	  //error
	std::shared_ptr<listNode> spa(pa,Del);	  //OK

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43579888/article/details/114092081
今日推荐