如下列代码:
int *a;
int *b;
a=new int[10]; //a指针指向了一个10成员的整形数组
b=a; //将b指针也指向此数组
这样做只是将a和b同时指向了一个数组,也就是所谓的浅复制.
这样做的缺点是,如果 delete [ ]a; b指针将指向一个被删除了的数组,会导致错误出现
与此相同的例子还有
class test
{
public:
~ test();
private:
int x;
int *p;
};
test::~test(){delete [ ]p;}//析构
class a;
class b;
a=b;//类内置的赋值运算符,浅复制
这样做当析构的时候就会导致错误!
针对第1个例子,我们拿出一个深复制的实例比较下
b=new int[10];
for(int j=0;j<10;j++)
b[j]=a[j];
这样做当delete [ ]a;就不会在出现b指针指向错误.
深复制中每个指针都指向它自己的数据.而浅复制中,2个或以上的指针指向同一块内存:既相同的数据.
而第2个例子必须要重载=号运算符伪代码如下:
const test&test::operator=(const test&rightObject)
{
if(this!=&rightObject) //avoid self-assignment
{
//algorithm to copy rightObject into this
}
return *this;
}
文章很浅显,又是第一次写,错误难免的,望大家指正