zoukankan      html  css  js  c++  java
  • 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
    ",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

  • 相关阅读:
    九宫格拼图 支持44 55等
    js 怎样获取div 图片等的宽度,只要值,不要px
    spring boot单元测试之RestTemplate(一)
    java设计模式-原型(prototype)
    Hibernate注解(二):关联关系映射注解
    spring之@value详解二(转载)
    spring之@Value详解(转载)
    Spring之基于注解的注入
    Spring之bean生命始末
    Spring之bean后处理器
  • 原文地址:https://www.cnblogs.com/zl1991/p/6945649.html
Copyright © 2011-2022 走看看