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
原文链接: https://www.cnblogs.com/zl1991/p/6945649.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/254824
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!