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

智能指针概述:

智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。

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;
};

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

时间: 2024-11-05 22:33:32

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

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

智能指针概述: 智能指针用来管理动态对象.其行为类似于常规指针,重要的差别是:它负责自己主动释放所指向的对象. C++ 11标准库提供两种智能指针:shared_ptr.unique_ptr 差别是:shared_ptr同意多个指针指向同一个对象:unique_ptr则独占所指向的对象. 另外.另一种weak_ptr的伴随类,它是一种弱引用.指向shared_ptr所管理的对象. 自己定义智能指针实现方法: 实现方法使用引用计数方法. 智能指针将一个计数器与类指向的对象相关联,引用计数跟踪一共同

智能指针原理与简单实现(转)

以下实现没有考虑线程安全的问题. 智能指针:它的一种通用实现方法是采用引用计数的方法.智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1: 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数: 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数:这是因此左侧的指针指向了右侧指针所指向的对象,因此右指针所

智能指针原理与简单实现

当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.    每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相

智能指针原理及实现(2)- unique_ptr

只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::scoped_ptr. unique_ptr 小巧高效:大小等同于一个指针,支持 rvalue 引用,从而可实现快速插入和对 STL 集合的检索.在头文件<memory>中. unique_ptr 为了避免和库里面的名称混淆,我自己实现的时候用的UniquePtr加以区分. 同一时刻,只能有一个un

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

(转)剖析C++标准库智能指针(std::auto_ptr)

不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦.垃圾回收 机制(Garbage Collection)一时颇受注目.然而垃圾自动回收机制并不能 满足内存管理的即时性和可视性,往往使高傲的程序设计者感到不自在. 况且,C++实现没有引入这种机制.在探索中,C++程序员创造了锋利的 "Smart Pointer".一定程度上,解决了资源泄露问题. 也许,经常的,你会写这样的代码: //x拟为class: // class x{ // public: // int

SmartPointer_智能指针

动态内存 C++中程序用堆来存储动态分配(dynamically allocate)的对象——即那些在程序运行时分配的对象. 动态内存的生存期由程序控制,也就是当动态对象不再使用时,我们必须显示的销毁它们. But众所周知(王小波句式),正确的管理动态内存是非常棘手的.如果忘了释放内存,就会导致内存泄漏:如果在还有指针引用内存时就去释放那块内存,那么那个指针就会变为一个引用非法内存的指针.thorny problem! 智能指针原理 So, 为了更容易更安全的使用动态内存,新的标准库提供了智能指

智能指针类模板(五十)

我们之前在 C++ 的学习中学习了有关智能指针的知识.那么智能指针的意义是现代 C++ 开发库中最重要的类模板之一:是 C++ 中自动内存管理的主要手段,它能够在很大程度上避开内存相关的问题.在 STL 标准库中的智能指针为 auto_ptr,它的特点是:1.生命周期结束时,销毁指向的内存空间:2.不能指向堆数组,只能指向堆对象(变量):3.一片堆空间只属于一个智能指针对象:4.多个智能指针对象不能指向同一片堆空间. 下来我们就来使用下 auto_ptr 智能指针 #include <iostr

智能指针(auto_ptr)vc版

auto_ptr包含于头文件 #include<memory> 其中<vector><string>这些库中也存有.auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释放内存. auto_ptr的设计目的: 局部对象获取的资源(内存),当函数退出时,它们的析构函数被调用,从而自动释放这些资源,但是,如果以显式手法获得的资源(称为动态分配内存空间如:new.malloc等)没有绑定在任何对象身上,必须以显式手法释放.(如:delete,free等).