1. 拷贝构造函数:深拷贝与浅拷贝的本质区别
在C++中,拷贝构造函数是一个特殊的成员函数,用于创建一个新对象作为现有对象的副本。当发生以下情况时会自动调用拷贝构造函数:
- 通过一个对象初始化另一个对象时
- 对象作为函数参数按值传递时
- 函数返回对象时(取决于编译器优化)
1.1 浅拷贝的陷阱
浅拷贝(默认拷贝行为)仅复制对象本身的内存内容,包括指针成员的值。这意味着新旧对象的指针成员将指向同一块堆内存。这种行为的危险性在于:
cpp复制class ShallowCopyExample {
public:
int* data;
ShallowCopyExample(int val) {
data = new int(val);
}
~ShallowCopyExample() {
delete data;
}
};
void problemDemo() {
ShallowCopyExample obj1(42);
ShallowCopyExample obj2 = obj1; // 浅拷贝发生
// 当obj1和obj2离开作用域时,它们的析构函数会尝试delete同一内存地址
}
这段代码会导致双重释放错误,因为两个对象的data指针指向同一地址,而析构函数会对该地址调用两次delete。
1.2 深拷贝的实现要点
深拷贝不仅复制对象本身,还复制对象持有的所有资源。对于包含动态分配内存的类,必须实现自定义的拷贝构造函数:
cpp复制class String {
public:
char* str_;
size_t size_;
// 深拷贝构造函数
String(const String& other) :
size_(other.size_),
str_(new char[other.size_ + 1]) // 分配新内存
{
std::memcpy(str_, other.str_, size_ + 1);
}
};
关键实现细节:
- 为新对象分配独立的内存空间
- 复制源对象的所有数据(包括字符串的终止符'\0')
- 确保新对象与源对象完全独立
重要提示:任何包含动态分配资源的类,都应该遵循"三大法则"(Rule of Three)——如果定义了拷贝构造函数、拷贝赋值运算符或析构函数中的任何一个,通常需要同时定义这三个。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 移动语义:现代C++的性能利器
移动语义是C++11引入的重要特性,旨在消除不必要的拷贝操作,提升程序性能。
2.1 左值、右值与右值引用
理解移动语义前,必须清楚几个关键概念:
|
