曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2049|回复: 0
打印 上一主题 下一主题

深复制与浅复制

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2013-9-30 15:05:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
默认的复制构造函数会逐个复制非静态成员及成员的值(如直接将一个对象通过赋值运算符赋值给另外一个对象时),这种成员复制也称为“浅复制”。浅复制最容易带来的问题是,两个类中的指针都指向同一个内存地址;这样当其中一个对象调用析构函数销毁自己时,内存被释放,这样就会让另一个对象的指针无的放矢,此外在调用析构函数时,会进行第二次内存释放,这是一种错误。

解决上述问题的办法是,提供一个重载的赋值运算符,它的实现与复制构造函数类似,在其中,不只是简单的复制指针地址,而是将指针所指向的内存中的内容也复制过来,这就是 深度复制。如下面代码所示:
[C++] 纯文本查看 复制代码
StringClass & StringClass::operator = (const StringClass &st)
{
   if (this == &st)
      return *this;   //如果是赋值给自己就直接返回

   delete [] str;      //释放原来的内存区

   len = st.len;
   str = new char [len + 1];   //新指向内存区的长度

   std::strcpy(str, st.str);      //拷贝字符串,这个就是“深复制” 了

   return *this;    // 返回调用对象的引用
}



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 23:27 , Processed in 0.060414 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表