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 ",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 ",value->refCount); 62 delete value; 63 } 64 else 65 { 66 printf("~String(): value->refCount=%d ",value->refCount); 67 } 68 } 69 70 void test() { 71 String ss("ssss"); 72 printf("ss.value->refCount=%d ",ss.value->refCount); 73 String s1 = ss; 74 printf("s1.value->refCount=%d ",s1.value->refCount); 75 printf("ss.value->refCount=%d ",ss.value->refCount); 76 String s2("dddd"); 77 printf("s2.value->refCount=%d ",s2.value->refCount); 78 s2 = ss; 79 printf("s2.value->refCount=%d ",s2.value->refCount); 80 printf("ss.value->refCount=%d ",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