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

本文介绍了C/C++中智能指针的概念,包括其在对象创建、拷贝构造、赋值操作和析构过程中的引用计数管理,并提供了一个自定义智能指针类的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能指针概述:

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

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

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

智能指针将一个计数器与类指向的对象相关联,引用计数跟踪一共有多少个类对象共享同一个指针。(即这个类对象在多少个地方被引用到)

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

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

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

[cpp]  view plain  copy
 print ?
  1. #include"iostream"  
  2. using namespace std;  
  3. //定义一个普通类  
  4. class bookClass{  
  5. private:  
  6.     string name;  
  7.     int price;  
  8. public:  
  9.     int getPrice(){ return price; }  
  10. };  
  11. //辅助类  
  12. class Counter  
  13. {  
  14. private:  
  15.     friend class smartPoint;  
  16.     Counter(bookClass *book) :bk(book), count(1){};  
  17.     ~Counter(){ delete bk; };  
  18.     int count;  
  19.     bookClass* bk;  
  20. };  
  21. //智能指针类  
  22. class  smartPoint  
  23. {  
  24. public:  
  25.     smartPoint(bookClass *bkC) :RpCnt(new Counter(bkC)){}  
  26.     smartPoint(const smartPoint &sp) :RpCnt(sp.RpCnt){ ++RpCnt->count; }  
  27.     smartPoint& operator= (const smartPoint& rhs)  
  28.     {  
  29.         ++rhs.RpCnt->count;  
  30.         if (--RpCnt->count == 0)  
  31.             delete RpCnt;  
  32.         RpCnt = rhs.RpCnt;  
  33.         return *this;  
  34.     }  
  35.       
  36.     ~smartPoint(){  
  37.         if (--RpCnt->count == 0)  
  38.             delete RpCnt;  
  39.     }  
  40. private:  
  41.     Counter *RpCnt;  
  42. };  
上述代码,实现了一个简单的智能指针类,可编译运行,逐条对比实现要点中的要求。

转载自:http://blog.youkuaiyun.com/tommyzht/article/details/47395385

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值