引言:为何需要资源管理法则?在C++发展历程中,资源管理始终是核心挑战。本文将通过三个经典案例,解析三法则(Rule of Three)、五法则(Rule of Five)到零法则(Rule of Zero)的演进逻辑,揭示现代C++资源管理的最佳实践。
一、法则演进图谱法则 | 适用标准 | 核心成员函数 | 设计哲学 |
三法则 | C++98 | 析构函数、拷贝构造、拷贝赋值 | 手动资源管理 |
五法则 | C++11 | 新增移动构造、移动赋值 | 移动语义扩展 |
零法则 | C++11/14 | 无需定义任何特殊成员函数 | RAII自动化管理 |
二、三法则(Rule of Three)深度解析经典案例:手动内存管理
class StringBuffer {
public:
StringBuffer(const char* str) {
size_ = strlen(str) + 1;
data_ = new char[size_];
memcpy(data_, str, size_);
}
~StringBuffer() { delete[] data_; } // 需要手动释放
private:
char* data_;
size_t size_;
};
违反三法则的灾难
StringBuffer a("Hello");
StringBuffer b = a; // 浅拷贝导致双重释放
正确实现三法则
class StringBuffer {
public:
// 拷贝构造函数
StringBuffer(const StringBuffer& other)
: size_(other.size_), data_(new char[size_])
{
memcpy(data_, other.data_, size_);
}
// 拷贝赋值运算符
StringBuffer& operator=(const StringBuffer& other) {
if (this != &other) {
delete[] data_;
size_ = other.size_;
data_ = new char[size_];
memcpy(data_, other.data_, size_);
}
return *this;
}
// 析构函数
~StringBuffer() { delete[] data_; }
private:
char* data_;
size_t size_;
};
三、五法则(Rule of Five)的移动语义革命