c++ 浅拷贝和深拷贝 举例简要说明。言简意赅。
2个回答
展开全部
class Test{
public:
Test(int num) : _val(new int(num)) {}
//Test(const Test &t) : _val(new int(*(t._val))) {}
~Test(){ delete _val; }
private:
int *_val;
};
现在定义两个对象,
Test t1(9);
Test t2(t1);
如果你不提供copy构造函数(注释掉的那个), 那么t1和t2的成员_val指向同一个对象,
当析构的时候, 同一个对象被析构了两次, 肯定出问题了.
反之, 提供了被注释的copy构造函数, t2的_val指向了一个新对象, 这样程序就没问题了.
前者就是潜拷贝, 后者就是深拷贝.
public:
Test(int num) : _val(new int(num)) {}
//Test(const Test &t) : _val(new int(*(t._val))) {}
~Test(){ delete _val; }
private:
int *_val;
};
现在定义两个对象,
Test t1(9);
Test t2(t1);
如果你不提供copy构造函数(注释掉的那个), 那么t1和t2的成员_val指向同一个对象,
当析构的时候, 同一个对象被析构了两次, 肯定出问题了.
反之, 提供了被注释的copy构造函数, t2的_val指向了一个新对象, 这样程序就没问题了.
前者就是潜拷贝, 后者就是深拷贝.
展开全部
例如,在一个类中,有一个指向一个Buffer的指针,所以我们可以说这个指针指向了一个资源(这个资源可以是一块保存数据的内存)。
浅拷贝,也就是按照比特一位一位地进行拷贝,是把一个类完全一样拷贝到另一个类。这时就出现问题了:类内部的指针的值是一样的,也就是说,两个类的实例内部的指针指向了同一块内存。当这两个对象析构的时候,同一块内存就会给析构两次,当然会出现问题。
深拷贝,就是在这点上和浅拷贝不同的,也就是说,在拷贝的时候,深拷贝会提供一块新的内存用来保存数据,并使新的对象的指针指向这块内存,这两个对象析构的时候,也就不会把同一块内存析构两次了。
一般,如果一个类的作者没有提供一个拷贝函数,编译器会自动提供一个拷贝函数,而这个拷贝函数就是浅拷贝。
浅拷贝,也就是按照比特一位一位地进行拷贝,是把一个类完全一样拷贝到另一个类。这时就出现问题了:类内部的指针的值是一样的,也就是说,两个类的实例内部的指针指向了同一块内存。当这两个对象析构的时候,同一块内存就会给析构两次,当然会出现问题。
深拷贝,就是在这点上和浅拷贝不同的,也就是说,在拷贝的时候,深拷贝会提供一块新的内存用来保存数据,并使新的对象的指针指向这块内存,这两个对象析构的时候,也就不会把同一块内存析构两次了。
一般,如果一个类的作者没有提供一个拷贝函数,编译器会自动提供一个拷贝函数,而这个拷贝函数就是浅拷贝。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询