在面向对象的编程过程中,深拷贝问题:
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;
}