C++中的深拷贝和浅拷贝

浅拷贝

顾名思义就是只进行简单的拷贝,比如,在拷贝构造函数中,只是进行简单的拷贝并不开辟新的空间

比如在这段代码中,可以看出这段代码在拷贝构造时采用了浅拷贝的方法

#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;
}
程序运行结果


由运行结果可知,此处采用的是深拷贝

C++ 中,拷贝是一种数据传递的方式,用于创建新对象并初始化为现有对象的状态。深拷贝浅拷贝主要涉及到复杂的数据结构,尤其是指针或引用类型的对象。 1. **浅拷贝** (Shallow Copy):当对包含指向动态分配内存的对象的简单值类型变量进行复制时,通常就是浅拷贝。它只是复制了对象的引用,并不会复制实际内容。例如,对于基本类型、栈上的数据以及没有成员指针的对象,浅拷贝就足够了。浅拷贝的对象之间修改会影响到彼此。 ```cpp int a = 5; int b = a; // 浅拷贝,ba共享相同的整数值 class Point { public: int x, y; }; Point p1(10, 20); Point p2 = p1; // 对于类 Point,这里也是浅拷贝,p2引用了p1的地址 ``` 2. **深拷贝** (Deep Copy):如果对象包含指针或引用,或者更复杂的结构(如自定义容器或有嵌套的对象),那么复制的是整个对象的内容,包括所有底层的动态分配的内存。这需要显式地实现拷贝构造函数赋值运算符,或者使用 `std::copy` 等库函数。深拷贝会创建一份独立的副本,修改一个副本不会影响到原始对象。 ```cpp // 深拷贝示例 Point p3(p1); // 对于类 Point,这是深拷贝,创建了一个新的 Point 实例并复制了其数据 std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = vec1; // 对于 std::vector,这也是深拷贝,每个元素都单独复制了一次 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值