天天看點

關于C++程式設計過程中遇到的深拷貝和引用計數

在面向對象的程式設計過程中,深拷貝問題:

1. 構造函數中有動态配置設定記憶體。

2.在指派函數中,通過直接指派時會造成被指派對象并沒有配置設定記憶體,隻是将被指派對象内部的指針指向指派對象動态配置設定好的位址,一旦指派對象被銷毀,被指派對象内部的指針指向内容已被銷毀,會造成無效引用,造成淺拷貝問題。

解決辦法:

通過引用計數解決問題,在指派函數和指派拷貝構造函數中将計數+1,析構是對計數進行判斷再銷毀。

class Data{
    public:
        Data():data(nullptr), ref(1){ dat = new int(0);}
        ~Data(){if(dat) delete dat, dat=nulltr;}

        Data(const Data &)=delete;
        Data & operator=(const Data &)=delete;

        int *dat;
        int ref;
};

class A{
    public:
        A();
        ~A();

        A(const A &);
        A& operator=(const A &a);

    private:
        Data *d;
};



A::A()
:d(new Data()){}

A::~A()
{
    if(d && !--d->ref)
        delete d;
}

A::A(const A& ia)
   :d(ia.d)
{
    if(d)
        d->ref++;
}


A& A::operatar=(const A& ia)
{
    if(this == *ia)
        return *this;
    if(ia.d)
        ++ia.d->ref;

    Data *old_d = d;
    d = ia.d;
    if(old_d && !--old_d->ref)
        delete old_d;
    return *this;
}

           

繼續閱讀