C++ 深拷贝与浅拷贝详解
在 C++ 编程中,对象的拷贝操作是一个常见需求,尤其在涉及动态内存管理时。拷贝行为分为深拷贝(Deep Copy)和浅拷贝(Shallow Copy),理解它们的区别和实现方式至关重要。
一、概念解析
1. 基本概念
- 浅拷贝(Shallow Copy):只复制对象本身,而不复制对象指向的底层数据(如指针指向的内存)。多个对象共享同一块内存,可能导致资源管理问题。
- 深拷贝(Deep Copy):不仅复制对象本身,还复制所有底层数据(如指针指向的内存),创建一个完全独立的副本,避免共享资源问题。
在 C++ 中,拷贝行为主要通过拷贝构造函数和赋值运算符实现。默认情况下,编译器生成的拷贝操作是浅拷贝。如果类涉及动态内存分配(如指针成员),则必须自定义深拷贝以避免错误。
2. 浅拷贝详解
- 默认行为:当类未自定义拷贝构造函数或赋值运算符时,编译器会生成默认版本,执行浅拷贝。这意味着:
- 对于非指针成员(如
int、double),直接复制值。 - 对于指针成员,只复制指针地址,而不是指针指向的数据。
- 对于非指针成员(如
- 潜在问题:
- 悬挂指针(Dangling Pointer):如果原对象被析构,其指针指向的内存被释放,拷贝对象中的指针仍指向已释放的内存,导致未定义行为。
- 内存泄漏(Memory Leak):如果多个对象共享同一内存,析构时可能多次释放同一块内存,引发崩溃。
- 数据不一致:一个对象修改共享数据会影响其他对象。
以下是一个浅拷贝示例,展示潜在问题:
#include <iostream>
using namespace std;
class ShallowCopy {
private:
int* data; // 指针成员
public:
// 构造函数,分配动态内存
ShallowCopy(int value) { data = new int(value); }
// 默认拷贝构造函数(浅拷贝)
ShallowCopy(const ShallowCopy& other) : data(other.data) {}
// 只复制指针地址
// 析构函数,释放内存
~ShallowCopy() { delete data; } // 释放动态内存
// 打印数据
{ cout << << *data << endl; }
};
{
;
ShallowCopy obj2 = obj1;
obj();
obj();
;
}


