C++浅拷贝和深拷贝

认真的MaverickIP属地: 加州
字数 235阅读 158

区别

  1. 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝。
  2. 深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝。

实例

浅拷贝

class Foo {
 public:
  Foo() : val(1) {
  }

  int val;
};

int main() {
  Foo theFoo;
  Foo theBar = theFoo;
  std::cout << theFoo.val << "\n"; // 0x16d3031dc
  std::cout << theBar.val << "\n"; // 0x16d3031d8
  // 浅拷贝会复制非地址变量,地址并不相同
}
class Foo {
 public:
  Foo() : val(new int(3)) {
  }

  int* val;
};

int main() {
  Foo theFoo;
  Foo theBar = theFoo;
  std::cout << theFoo.val << "\n"; // 0x139e067c0
  std::cout << theBar.val << "\n"; // 0x139e067c0
  // 指针的浅拷贝地址相同
}

深拷贝

class Foo {
 public:
  Foo() : val(new int(3)) {
  }

  ~Foo() {
    delete val;
    val = nullptr;
  }

  Foo(const Foo& aCopy) {
    val = new int(*aCopy.val);
  }

  int* val;
};

int main() {
  Foo theFoo;
  Foo theBar = theFoo;
  std::cout << theFoo.val << "\n"; // 0x1246067c0
  std::cout << theBar.val << "\n"; // 0x1246067d0
  // 深拷贝地址并不相同
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
0人点赞
更多精彩内容,就在简书APP
"小礼物走一走,来简书关注我"
还没有人赞赏,支持一下
总资产0共写了1428字获得2个赞共0个粉丝

推荐阅读更多精彩内容