1. 拷贝构造:从浅拷贝到深拷贝的完整指南
在C++中,对象拷贝是一个看似简单实则暗藏玄机的操作。作为一位经历过无数次内存泄漏和悬垂指针折磨的老程序员,我想分享一些关于拷贝构造的实战经验。
1.1 浅拷贝的陷阱与本质
浅拷贝(Shallow Copy)就像复印一张名片——你得到了外观完全相同的副本,但名片上写的电话号码指向的是同一个实体。编译器默认提供的拷贝构造函数就是典型的浅拷贝实现:
cpp复制class ShallowExample {
public:
int* data;
// 编译器生成的默认拷贝构造
ShallowExample(const ShallowExample& other)
: data(other.data) {} // 仅复制指针值
};
这种拷贝方式在以下场景会引发严重问题:
- 当原对象被销毁时,拷贝对象的指针变成悬垂指针
- 通过任一对象修改共享资源会影响另一个对象
- 重复释放同一块内存会导致程序崩溃
我在早期项目中就曾因为浅拷贝问题导致服务器程序随机崩溃,最终通过valgrind工具才定位到这个"内存幽灵"。
1.2 深拷贝的实现艺术
深拷贝(Deep Copy)才是处理资源管理的正确方式,它需要我们自己实现拷贝构造函数和赋值运算符。以字符串类为例:
cpp复制class String {
public:
char* buffer;
size_t length;
// 深拷贝构造函数
String(const String& other)
: length(other.length),
buffer(new char[other.length + 1]) {
std::copy(other.buffer, other.buffer + length + 1, buffer);
}
// 赋值运算符重载
String& operator=(const String& other) {
if (this != &other) { // 防止自赋值
delete[]
