在面向對象的程式設計過程中,深拷貝問題:
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;
}