码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++知识要点5——智能指针原理及自定义实现

时间:2015-08-10 12:07:49      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:智能指针   引用计数   

智能指针概述:

智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象
C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr
区别是:shared_ptr允许多个指针指向同一个对象;unique_ptr则独占所指向的对象。
另外,还有一种weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。

自定义智能指针实现方法:

实现方法使用引用计数方法。

智能指针将一个计数器与类指向的对象相关联,引用计数跟踪一共有多少个类对象共享同一指针。

实现要点:
  1. 每次创建类的新对象的时候,初始化指针并将引用计数置为1;
  2. 当对象作为另一对象的副本而创建的时候,也就是拷贝构造时候,拷贝构造函数拷贝指针并增加与之对应的引用计数;
  3. 当对一个对象进行赋值操作的时候,赋值操作符 减少左操作数所指对象的引用计数(若引用计数减为0,则删除该对象),并增加右操作数指向对象的引用计数(因为左侧指针指向了右侧指针指向的对象,所以右侧指针指向的对象的引用计数增加1);
  4. 调用析构函数时候,减少引用计数(若减为0,则删除基础对象);

实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。

下面例子使用辅助类来实现:

#include"iostream"
using namespace std;
//定义一个普通类
class bookClass{
private:
	string name;
	int price;
public:
	int getPrice(){ return price; }
};
//辅助类
class Counter
{
private:
	friend class smartPoint;
	Counter(bookClass *book) :bk(book), count(1){};
	~Counter(){ delete bk; };
	int count;
	bookClass* bk;
};
//智能指针类
class  smartPoint
{
public:
	smartPoint(bookClass *bkC) :RpCnt(new Counter(bkC)){}
	smartPoint(const smartPoint &sp) :RpCnt(sp.RpCnt){ ++RpCnt->count; }
	smartPoint& operator= (const smartPoint& rhs)
	{
		++rhs.RpCnt->count;
		if (--RpCnt->count == 0)
			delete RpCnt;
		RpCnt = rhs.RpCnt;
		return *this;
	}
	
	~smartPoint(){
		if (--RpCnt->count == 0)
			delete RpCnt;
	}
private:
	Counter *RpCnt;
};




上述代码,实现了一个简单的智能指针类,可编译运行,逐条对比实现要点中的要求。


C/C++知识要点5——智能指针原理及自定义实现

标签:智能指针   引用计数   

原文地址:http://blog.csdn.net/tommyzht/article/details/47395385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!