zoukankan      html  css  js  c++  java
  • 引用计数

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    class String {
    public:
        String(const char *pdata);
        String(const String &rhs);
        String &operator = (const String &rhs);
        ~String();
    private:
        class StringValue {
        public:
            int refCount;
            char *data;
            StringValue(const char *pdata);
            ~StringValue();
        };
    
        StringValue *value;//所有的引用对象均共享唯一一个value,value里面实际存储data和引用次数
    };
    
    String::StringValue::StringValue(const char *pdata) :refCount(1) {
        data = new char[strlen(pdata) + 1];
        strcpy(data, pdata);
    }
    
    String::StringValue::~StringValue() {
        delete[] data;
    }
    
    String::String(const char *pdata) :value(new StringValue(pdata))
    {}
    
    String::String(const String &rhs) {//要对引用加1
        value = rhs.value;
        value->refCount++;//所有指向同一段data的对象的引用加1
    }
    
    String &String::operator =(const String &rhs) {
        if (value == rhs.value)//注意,不是this == &rhs
            return *this;
        if (--value->refCount == 0)
            delete value;
    
        value = rhs.value;
        ++value->refCount;
    
        return *this;
    }
    
    String::~String() {
        if (--value->refCount == 0)
            delete value;
    }
    
    void test() {
        String ss("ssss");
        String s1 = ss;
        String s2("dddd");
        s2 = ss;
    }
    
    int main() {
        test();
    }
  • 相关阅读:
    梦断代码阅读笔记一
    进度一
    LOJ#6031. 「雅礼集训 2017 Day1」字符串
    cf700E. Cool Slogans
    BZOJ1014: [JSOI2008]火星人prefix
    BZOJ2716: [Violet 3]天使玩偶
    cf1080F. Katya and Segments Sets
    BZOJ1354: [Baltic2005]Bus Trip
    灭绝树题集
    How Many Substrings?
  • 原文地址:https://www.cnblogs.com/luoyinjie/p/9982036.html
Copyright © 2011-2022 走看看