引用计数简单底层实现

 

利用一个对象指针实现通过拷贝构造函数和赋值运算符实现计数引用

注意:析构是要判断当前的值是否为1,如果为1则删除,否则减一

class HasPtr {
public:
    HasPtr(const string& s = string()) : ps(new string(s)), i(0), use(new size_t(1)) {}
    ~HasPtr() {
        if (--*use == 0) {
            delete use;
            delete ps;
        }
    }
    HasPtr& operator=(const HasPtr& p) ;
    HasPtr(const HasPtr& p) ;
​
    string *ps;
    std::size_t* use;
    int i;
};
​
HasPtr& HasPtr::operator=(const HasPtr &p) {
    ++*p.use;
    if (--*use == 0) {
        delete use;
        delete ps;
    }
    use = p.use;
    i = p.i;
    ps = p.ps;
}
​
HasPtr::HasPtr(const HasPtr &p) : ps(p.ps), i(p.i) {
    use = p.use;
    ++*use;
}
​
int main() {
    HasPtr p("dfaf");
    HasPtr p1(p);
    HasPtr p2 = p1;
    cout << *p.use << " " << *p1.use << " " << *p2.use << endl;
​
    return 0;
}

 

 

posted @ 2021-05-07 19:34  Baymax_HH  阅读(73)  评论(0)    收藏  举报