1. C++对象拷贝与移动的核心机制解析
在C++开发中,对象拷贝与移动是最基础也最容易被误解的概念之一。我见过太多项目因为不当的拷贝操作导致内存泄漏,也调试过不少因移动语义使用不当引发的诡异崩溃。今天我们就彻底拆解这组核心机制,从内存布局层面理解它们的本质差异。
1.1 拷贝构造的两种实现路径
浅拷贝(Shallow Copy)就像复印名片——只复制了指针本身,新旧对象指向同一块内存。这种默认行为在包含指针成员时极其危险:
cpp复制class Problematic {
char* data;
public:
Problematic(const char* str) {
data = new char[strlen(str)+1];
strcpy(data, str);
}
~Problematic() { delete[] data; }
// 默认拷贝构造就是浅拷贝
};
void disaster() {
Problematic obj1("test");
Problematic obj2 = obj1; // 双重释放警告!
}
深拷贝(Deep Copy)则是连指针指向的内容一起复制,相当于重新申请内存并复制数据。这是资源管理类的标配:
cpp复制class SafeCopy {
char* data;
public:
SafeCopy(const SafeCopy& other) {
data = new char[strlen(other.data)+1]; // 关键步骤
strcpy(data, other.data);
}
};
关键经验:任何包含原始指针、文件句柄等资源的类,必须实现深拷贝构造函数,否则必然导致资源重复释放或泄漏。
1.2 移动语义的革命性意义
C++11引入的移动构造/移动赋值,解决了深拷贝的性能瓶颈。其核心思想是"资源所有权转移"而非复制:
cpp复制class Movable {
int* big_data;
public:
Movable(Movable&& other) noexce
