1、设计引用计数类:
以string类为例,其结构为:
具体结构如下:
1、string类包含一个智能指针RCPtr
;
2、智能指针RCPtr
指向包含引用计数的类对象StringValue
;
3、类对象StringValue
继承自通用引用计数基类RCObject
(该基类内含计数器);
4、类对象StringValue
包含一个指针指向实际堆内存(string类的真实内容)。
与普通堆上对象的差别: 普通堆对象包含一个指针,该指针直接指向堆内存;而引用计数类对了一个中间桥梁用于计算对象个数。
注:智能指针RCPtr
构造参数为StringValue
指针。
具体实现代码:
头文件:More Effective C++ 条款29 170页-171页
源文件:More Effective C++ 条款29 172页-174页
2、在现存类上增加引用计数:
格言:计算机科学中的绝大部分问题都可以通过增加一个中间层次来解决。我们增加一个新类CountHolder以处理引用计数,它从RCObject继承。
现存类为Widget,增加引用计数后的类未RCWidget,具体结构如下:
1、RCWidget
类包含一个智能指针RCIPtr
;
2、智能指针RCIPtr
指向包含引用计数的类对象CountHolder
;
3、类对象CountHolder
继承自通用引用计数基类RCObject
(该基类内含计数器);
4、类对象CountHolder
包含一个指针指向类Widget。
注:智能指针RCIPtr
构造参数为Widget
指针;RCIPtr
类中成员指针指向自己new的CountHolder
对象,而把构造参数Widget
指针赋值给new出来的CountHolder
对象中的指针。
具体实现代码:
源文件:More Effective C++ 条款29 175页-178页
总结:
1、计算机科学中的绝大部分问题都可以通过增加一个中间层次来解决。
2、引用计数实现方式均为:包裹类包含一个智能指针,指针指向引用计数类,引用计数类指向真实对象。