设为首页 加入收藏

TOP

C++拷贝构造函数详解(八)
2012-12-10 12:48:45 来源: 作者: 【 】 浏览:2544
Tags:拷贝 构造 函数 详解

  int main()

  {

  Rect rect1;

  Rect rect2(rect1);   // 复制对象

  return 0;

  }

  在这段代码运行结束之前,会出现一个运行错误。原因就在于在进行对象复制时,对于动态分配的内容没有进行正确的操作。我们来分析一下:

  在运行定义rect1对象后,由于在构造函数中有一个动态分配的语句,因此执行后的内存情况大致如下:

  
 
    在使用rect1复制rect2时,由于执行的是浅拷贝,只是将成员的值进行赋值,这时 rect1.p= rect2.p,也即这两个指针指向了堆里的同一个空间,如下图所示:

 
当然,这不是我们所期望的结果,在销毁对象时,两个对象的析构函数将对同一个内存空间释放两次,这就是错误出现的原因。我们需要的不是两个p有相同的值,而是两个p指向的空间有相同的值,解决办法就是使用“深拷贝”。

3. 深拷贝
    在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间,如上面的例子就应该按照如下的方式进行处理:
[c-sharp] 
class Rect 

public: 
    Rect()      // 构造函数,p指向堆中分配的一空间 
    { 
        p = new int(100); 
    } 
    Rect(const Rect& r) 
    { 
        width = r.width; 
        height = r.height; 
        p = new int;    // 为新对象重新动态分配空间 
        *p = *(r.p); 
    } 
    ~Rect()     // 析构函数,释放动态分配的空间 
    { 
        if(p != NULL) 
        { 
            delete p; 
        } 
    } 
private: 
    int width; 
    int height; 
    int *p;     // 一指针成员 
}; 
此时,在完成对象的复制后,内存的一个大致情况如下:
 

  此时rect1的p和rect2的p各自指向一段内存空间,但它们指向的空间具有相同的内容,这就是所谓的“深拷贝”。

          

首页 上一页 5 6 7 8 9 10 11 下一页 尾页 8/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++完美实现Singleton模式 下一篇C++实现链队列的基础操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: