深拷贝必须手动实现,因默认拷贝构造函数仅浅拷贝指针值,导致野指针或重复释放;需显式定义const引用参数的拷贝构造函数及赋值运算符,并推荐用RAII容器替代裸指针。
深拷贝必须手动实现,编译器默认的拷贝构造函数只做浅拷贝
当你类中持有 new 出来的指针、malloc 分配的内存,或封装了类似 FILE*、int fd 这类资源句柄时,编译器自动生成的拷贝构造函数只会复制指针值(即地址),不会复制它指向的内容。两个对象最终指向同一块内存——一旦其中一个析构时 delete 了,另一个再访问就是野指针;若都析构,还会触发重复释放(double free)。
解决方式只有一个:显式定义拷贝构造函数,并在其中用 new(或 malloc)为新对象分配独立内存,再逐字节或按逻辑拷贝原始数据。
常见错误示例:
class Buffer {
public:
char* data;
size_t size;
Buffer(size_t s) : size(s) { data = new char[s]; }
// ❌ 缺失拷贝构造函数 → 默认浅拷贝
~Buffer() { delete[] data; }
};
正确写法需补上:
立即学习“C++免费学习笔记(深入)”;
Buffer(const Buffer& other) : size(other.size) {
data = new char[size];
std::copy(other.data, other.data + size, data);
}
拷贝构造函数参数必须是 const 引用,否则会无限递归
如果写成 Buffer(Buffer other) 或 Buffer(Buffer& other),前者传参会触发拷贝构造本身(还没进函数体就又调一次),后者虽不递归但无法绑定临时对象或 const 对象,实用性极差。
必须使用 const Buffer& ——既避免拷贝开销,又保证能接收所有合法右值/左值。
容易踩的坑: