#include <iostream>
#include <cstring>
class ResourceClass {
private:
int* data;
size_t size;
public:
// 构造函数
ResourceClass(size_t s) : size(s) {
data = new int[s];
}
// 析构函数
~ResourceClass() {
delete[] data;
}
// 拷贝构造函数
ResourceClass(const ResourceClass& other) : size(other.size) {
data = new int[size];
std::memcpy(data, other.data, size * sizeof(int));
}
// 赋值运算符重载
ResourceClass& operator=(const ResourceClass& other) {
// 自我赋值检测
if (this == &other) {
return *this;
}
// 释放旧内存
delete[] data;
// 分配新内存并拷贝数据
size = other.size;
data = new int[size];
std::memcpy(data, other.data, size * sizeof(int));
return *this;
}
};
自我赋值检测的重要性
- 避免内存释放问题:如果不检测自我赋值,在执行
delete[] data;
时,可能会释放掉正要赋值的对象的内存,导致数据丢失和程序崩溃。例如,a = a;
这种情况,如果不检测,a
的内存会被释放,后续的 new
操作会在已经释放的内存上进行,引发未定义行为。
- 提高效率:自我赋值时不需要进行复杂的内存重新分配和数据拷贝操作,直接返回对象自身引用可以避免不必要的开销,提高程序运行效率。