• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++简单实现对象引用计数示例(转)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#异步编程demo(asyncawait)发布时间:2022-07-14
下一篇:
使用Linq对多个对象进行join操作C#发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap