C++中智能指针的工作原理和简单实现

柔光的暖阳◎ 2022-02-25 00:12 311阅读 0赞
  1. 智能指针:它的一种通用实现方法是采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。
  2. 每次创建类的新对象时,初始化指针并将引用计数置为1
  3. 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;
  4. 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;这是因此左侧的指针指向了右侧指针所指向的对象,因此右指针所指向的对象的引用计数+1
  5. 调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。
  6. 实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。这里主要讲一下引入辅助类的方法,看下面的例子:

?










1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53



class 
Point                                      
//基础对象类,要做一个对Point类的智能指针


{


public
:


    
Point(
int 
xVal = 0,
int 
yVal = 0):x(xVal),y(yVal) { }


    
int 
getX()
const 
{
return 
x; }


    
int 
getY()
const 
{
return 
y; }


    
void 
setX(
int 
xVal) { x = xVal; }


    
void 
setY(
int 
yVal) { y = yVal; }


private
:


    
int 
x,y;


};


class 
RefPtr                                 
//辅助类


{
//该类成员访问权限全部为private,因为不想让用户直接使用该类


 
friend 
class 
SmartPtr;     
//定义智能指针类为友元,因为智能指针类需要直接操纵辅助类


 
RefPtr(Point ptr):p(ptr), count(1) { }


 
~RefPtr() {
delete 
p; }


  


 
int 
count;                                                    
//引用计数


 
Point
p;                                                     
//基础对象指针


};


  


class 
SmartPtr                                            
//智能指针类


{


public
:


 
SmartPtr(Point ptr):rp(
new 
RefPtr(ptr)) { }                                
//构造函数


 
SmartPtr(
const 
SmartPtr &sp):rp(sp.rp) { ++rp->count; }           
//复制构造函数


 
SmartPtr& operator=(
const 
SmartPtr& rhs) {                             
//重载赋值操作符


  
++rhs.rp->count;                                                        
//首先将右操作数引用计数加1,


  
if
(—rp->count == 0)                                                                    
//然后将引用计数减1,可以应对自赋值


   
delete 
rp;


  
rp = rhs.rp;


  
return 

this
;


 
}


 
~SmartPtr() {                                           
//析构函数


  
if
(—rp->count == 0)                                 
//当引用计数减为0时,删除辅助类对象指针,从而删除基础对象


   
delete 
rp;


 
}


  


private
:


 
RefPtr rp;                                               
//辅助类对象指针


};


  


int 
main()


{


 
Point
p1 =
new 
Point(10, 8);


 
SmartPtr sp1(p1);   
//此时sp1.rp->count = 1


 
SmartPtr sp2(sp1);   
//首先将sp1.rp->count赋给sp2.rp->count,之后sp2.rp->count++,这时sp1,sp2的rp是同一个对象


 
Point *p2 =
new 
Point(5, 5);


 
SmartPtr sp3(p2);


 
sp3 = sp1;


  


 
return 
0;


}

  

使用该方式的内存结构图如下:

2012031720360936.png

发表评论

表情:
评论列表 (有 0 条评论,311人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++智能指针简单剖析

    智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。 1. 智能指针背后的设

    相关 基于C++实现一个简单智能指针

    在C、C++类的语言当中对指针的使用是十分常见和重要的,但是使用指针也很容易导致内存泄漏、不安全的情况发生,本文就针对这种情况来实现一个简单的智能指针类,通过这个类实现对指针操

    相关 C++-智能指针——简单实现分析

    > 一:为什么要有智能指针 在我们动态开辟内存时,每次new完就一定会有配套的delete来完成释放操作。可是这时候问题就来了,有时候程序未必会执行到我们释放的那一步,