C++简单实现对象引用计数示例(转)
C++简单实现对象引用计数示例
1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 6 class String { 7 public: 8 String(const char *pdata); 9 String(const String &rhs); 10 String &operator = (const String &rhs); 11 ~String(); 12 13 public: //应该使用private,但为了演示的目的而使用public 14 //内部类 15 class StringValue { 16 public: 17 StringValue(const char *pdata); 18 ~StringValue(); 19 public: 20 int refCount; 21 char *data; 22 }; 23 24 StringValue *value;//所有的引用对象均共享唯一一个value,value里面实际存储data和引用次数 25 }; 26 27 String::StringValue::StringValue(const char *pdata):refCount(1) { 28 data = new char[strlen(pdata) + 1]; 29 strcpy(data,pdata); 30 } 31 32 String::StringValue::~StringValue() { 33 delete [] data; 34 } 35 36 String::String(const char *pdata) : value(new StringValue(pdata)) {} 37 38 String::String(const String &rhs) {//要对引用加1 39 value = rhs.value; 40 (value->refCount)++;//所有指向同一段data的对象的引用加1 41 } 42 43 String &String::operator =(const String &rhs) { 44 if (value == rhs.value)//注意,不是this == &rhs 45 return *this; 46 if(--value->refCount == 0) 47 { 48 printf("operator =[delete value] value->refCount=%d\n",value->refCount); 49 delete value; 50 } 51 52 value = rhs.value; 53 ++(value->refCount); 54 55 return *this; 56 } 57 58 String::~String() { 59 if ( (--value->refCount) == 0 ) 60 { 61 printf("~String():[delete value] value->refCount=%d\n",value->refCount); 62 delete value; 63 } 64 else 65 { 66 printf("~String(): value->refCount=%d\n",value->refCount); 67 } 68 } 69 70 void test() { 71 String ss("ssss"); 72 printf("ss.value->refCount=%d\n",ss.value->refCount); 73 String s1 = ss; 74 printf("s1.value->refCount=%d\n",s1.value->refCount); 75 printf("ss.value->refCount=%d\n",ss.value->refCount); 76 String s2("dddd"); 77 printf("s2.value->refCount=%d\n",s2.value->refCount); 78 s2 = ss; 79 printf("s2.value->refCount=%d\n",s2.value->refCount); 80 printf("ss.value->refCount=%d\n",ss.value->refCount); 81 } 82 83 int main() { 84 test(); 85 }
运行结果如下:
ss.value->refCount=1
s1.value->refCount=2
ss.value->refCount=2
s2.value->refCount=1
operator =[delete value] value->refCount=0
s2.value->refCount=3
ss.value->refCount=3
~String(): value->refCount=2
~String(): value->refCount=1
~String():[delete value] value->refCount=0
转自:http://blog.csdn.net/chinawangfei/article/details/50680574
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
c++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了