浅拷贝&深拷贝的再次理解

以前对浅拷贝的认识不够,认为只是对指针的赋值,没有真实的开辟空间。看了一篇博客后感觉自己的认识还不够,其实浅拷贝还会导致内存泄漏!对,你没看错,确实是 内存泄漏!最后会把博客链接贴出来。

我们以前对浅拷贝深拷贝的理解是这样的:
浅拷贝是对指针的拷贝,拷贝以后两个指针指向的是同一块内存空间, 深拷贝是另外开辟一块空间,两个指针指向不同的空间,当一个指针释放后,另一个指针照样可以使用。

然而浅拷贝在一个指针释放后,还存在一个问题就是,这块空间不能使用了,即内存泄漏。
下面贴一段代码:
class A
{
public :
     A()
     {
          _a= new char (100);
          cout<< "A()" <<endl;
     }
     ~A()
     {
           if (_a)
          {
               delete _a;
              _a=NULL;
              cout<< "~A()" <<endl;
          }
     }
private :
      char * _a;
};
void test()
{
     A a;
     A b(a);
}

你们可以试验一下,我运行后会报错!这是为什么呢?
我们没有定义拷贝构造函数,对象b调用的是默认的拷贝构造函数,执行的是浅拷贝。程序运行结束对象a析构后,_a指向的空间被释放。然而b对象的_a还在指向这块空间,再次delete就会报错,报错原因就是对同一块空间delete两次。
至此我们无法再操作这块空间,造成内存泄漏!
这里总结一下浅拷贝会出现的问题:
  1. 浅拷贝只是拷贝了一个指针,两个指针指向同一块内存,这样delete两次后会报错。
  2. 由于两个指针都指向同一个内存所以,任何一个指针对内存的操作都会影响到另一个
  3. 会造成内存泄漏!(绝对的硬伤啊,看你以后还用不)大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值