目 录CONTENT

文章目录

C++ 深拷贝和浅拷贝

TalentQ
2025-09-11 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

浅拷贝 (Shallow Copy)

  • 是什么:编译器默认生成的拷贝构造函数和赋值运算符重载函数进行的拷贝就是浅拷贝。它进行的是按成员拷贝(member-wise copy),即简单地将原对象的每个成员的值复制给新对象。

  • 对指针的影响:如果对象中有指针成员,浅拷贝只会复制这个指针变量本身(即内存地址),而不会复制指针所指向的那块内存

  • 带来的问题

    1. 双重释放(Double Free):当两个对象的指针成员指向同一块堆内存时,这两个对象的析构函数会尝试释放同一块内存,导致未定义行为(通常是程序崩溃)。

    2. 数据篡改(Dangling Pointer):通过其中一个对象修改指针指向的内容,会影响到另一个对象,因为它们共享同一份数据。

深拷贝 (Deep Copy)

  • 是什么:需要程序员手动实现的拷贝方式。在拷贝时,会为新的对象重新申请一块新的堆内存,并将原对象指针指向的内容(而不仅仅是地址)完整地复制到这块新内存中。

  • 对指针的影响:新对象和原对象的指针成员值(地址)不同,但指向的内容相同。它们各自拥有独立的资源。

  • 优点:彻底避免了浅拷贝带来的双重释放和数据篡改问题。

  • 代价:需要手动编码,并且因为涉及内存分配和数据复制,性能开销比浅拷贝大。

为什么需要深拷贝?

C++默认提供浅拷贝是为了效率。对于大多数不管理资源的类(例如,类成员只有int, double, std::string等),浅拷贝完全足够且高效。

但是,当一个类拥有并管理动态分配的资源(如堆内存、文件句柄等)时,就必须自定义拷贝构造函数和拷贝赋值运算符来实现深拷贝,以确保每个对象都有其资源的独立副本。

Rule of Three(三法则)

如果一个类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符中的任何一个,那么它通常需要全部三个。

0

评论区