浅拷贝
顾名思义就是只进行简单的拷贝,比如,在拷贝构造函数中,只是进行简单的拷贝并不开辟新的空间
比如在这段代码中,可以看出这段代码在拷贝构造时采用了浅拷贝的方法
#include
#include
using namespace std;
class Array
{
private:
int* _ptr;
size_t _sz;
public:
Array(size_t sz=2)
:_sz(sz)
{
_ptr = new int[_sz];
}
Array(const Array& arr)
{
_sz = arr._sz;
_ptr = arr._ptr;
}
~Array()
{
if (_ptr != NULL)
{
delete[] _ptr;
_ptr = NULL;
}
}
};
int main()
{
Array arr1(5);
Array arr2(arr1);
printf("%p\n", arr1);
printf("%p\n", arr2);
return 0;
}
程序运行结果:
可以看出,程序此时有问题,而打印出的地址是相同的,可以验证此时采用的是浅拷贝
浅拷贝时会造成,多个变量使用同一块内存空间,在析构时,会导致将一块空间多次析构,引发
深拷贝
在拷贝的时候给新的对象另外开辟一块内存空间,使两者都存在自己独立的内存空间,再进行拷贝
下面这段代码在拷贝时采用深拷贝
#include
using namespace std;
class Array
{
public:
Array(int sz = 4)
{
_sz = sz;
_ptr = new int[_sz];
cout << "Array() " << endl;
}
~Array()
{
cout << "~Array()" << endl;
if (_ptr != NULL)
{
delete[] _ptr;
_ptr = NULL;
}
}
Array(const Array& arr)
:_sz(arr._sz)
, _ptr(new int[_sz])
{
cout << "Array(const Array&arr)" << endl;
memcpy(_ptr, arr._ptr, _sz*(sizeof(int)));
}
private:
size_t _sz;
int *_ptr;
};
int main()
{
Array arr1(8);
Array arr2(arr1);
printf("%p\n", arr1);
printf("%p\n", arr2);
return 0;
}
由运行结果可知,此处采用的是深拷贝