浅拷贝和深拷贝
指针浅拷贝导致堆区的数据重复释放
问题:近期在做算法实验的时候碰到一个关于类指针赋值的问题,简单的指针之间的赋值只是把两个指针指向同一个地址,而我需要把每次算法执行完的类指针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;
}
‘’’
类指针和类内成员p指针都指向了不同的地址