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

    #include <stdio.h>
    #include <string.h>
    class String        
    {            
    private:            
        struct StringValue            
        {        
            int refCount;
            char *data;
            StringValue(const char *initValue);
            ~StringValue();
        };
        StringValue *value;
    public:
        String(const char *initValue = "");         //constructor
        String(const String &rhs);                  //copy constructor
        String &operator=(const String &rhs);       //assignment operator
        const char &operator[](size_t index) const; //重载[]运算符,针对const Strings
        char &operator[](size_t index);             //重载[]运算符,针对non-const Strings
        ~String();                                  //destructor
    };
    String::StringValue::StringValue(const char *initValue) : refCount(1)
    {
        data = new char[strlen(initValue) + 1];
        strcpy_s(data, 1, initValue);    
    }
    String::StringValue::~StringValue()
    {
        delete[] data;
    }    
    String::String(const char *initValue) : value(new StringValue(initValue))
    {                
    }
    String::String(const String &rhs) : value(rhs.value)            
    {        
        ++value->refCount;    
    }        
    String::~String()    
    {        
        if (--value->refCount == 0)        
            delete value;
    }    
    String &String::operator=(const String &rhs)
    {
        if (this->value == rhs.value) //自赋值
            return *this;
        //赋值时左操作数引用计数减1,当变为0时,没有指针指向该内存,销毁
        if (--value->refCount == 0)
            delete value;
        //不必开辟新内存空间,只要让指针指向同一块内存,并把该内存块的引用计数加1
        value = rhs.value;
        ++value->refCount;
        return *this;
    }
    const char &String::operator[](size_t index) const
    {    
        return value->data[index];
    }
    //重载[]运算符,针对non-const Strings
    char &String::operator[](size_t index)
    {    
        if (value->refCount > 1)    
        {    
            --value->refCount;
            value = new StringValue(value->data);
        }
        if (index < strlen(value->data))
            return value->data[index];
    }
    #include <iostream>
    #include <string>
    using namespace std;
    std::string a = "lvlv";
    void main()
    {            
        char *p = &a[1];            
        *p = 'a';    
        std::string b = a;
        std::cout << "b:" << b << endl;
        system("pause");    
        return;            
    }
  • 相关阅读:
    android 服务与多线程
    “产品级敏捷” 的这条路; 逐步的形成一高效的产品开发生态系统
    hdoj 1116 Play on Words 【并查集】+【欧拉路】
    辛星跟您玩转vim第四节之操作文本内容
    UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP
    CMMI过程改进反例
    UVA 11077
    Yii 框架 URL路径简化
    交水费一波四折
    雷观(十五):提高生产力和程序员价值的2种方法
  • 原文地址:https://www.cnblogs.com/feihum/p/11132352.html
Copyright © 2011-2022 走看看