C++对象指针浅拷贝和深拷贝

时间:2022-07-08 19:54:38

2017年12月7日,这是我在CSDN写的第一篇博客,写博客的目的也是对我知识进行查漏补缺,把我C++之路遇到的种种问题记录下来,让自己不能反同样的错误。 

-------杂谈

浅拷贝和深拷贝

问题:近期在做算法实验的时候碰到一个关于类指针赋值的问题,简单的指针之间的赋值只是把两个指针指向同一个地址,而我需要把每次算法执行完的类指针push_back进vector储存每次算法迭代的结果,如果每次都是存入同一个指针,就会出现vector中的类指针都指向同一个地址,这就让我想到了能不能进行类指针之间的赋值,两个类指针之间内容相同,但是指针指向的地址都不同,就是两个不同的指针。


定义

浅拷贝:按照我的理解就是,两类之间发生数据成员的赋值,如果只是简单数据类型之间的赋值,浅拷贝完全能够胜任,但是碰到有指针的时候,两个类之间浅拷贝,那么两个对象中的指针会指向同一个地址,那么析构函数执行的时候就会发生错误(同一指针释放了两次)。

深拷贝:在浅拷贝的基础上对指针拷贝进行处理,让两个类指针中的指针指向不同的区域,这样两个类指针虽然内容想到,但是是存储在内存的不同区域。

下面是实验的代码

class rect
{
public:

	rect();
	rect(const rect *r);
	~rect();

private:
	int width, height;
	int *p;
};
rect::rect(const rect *r)
{
	width = r->width;
	height = r->height;
	p = new int;
	*p = *(r->p);
}

rect::rect()
{
	p = new int(100);
}

rect::~rect()
{
	if (p != NULL)
		delete p;
}
int _tmain(int argc, _TCHAR* argv[])
{
	rect *rect1;
	rect *rect2;
	rect1 = new rect;
	rect2 = new rect(rect1);

	return 0;
}
实验结果: C++对象指针浅拷贝和深拷贝

类指针和类内成员p指针都指向了不同的地址