如何在 C++ 的 operator= 中处理自我赋值
在 C++ 中,经常会用到赋值操作符(operator=)来对一个对象进行赋值。然而,如果不小心给一个对象赋予了自身的值,就会导致内存泄漏和未定义行为等问题。这种情况被称为“自我赋值”(self-assignment)。如何在 operator= 中正确处理自我赋值呢?
一种简单的解决方案是将左值引用(lvalue reference)作为参数,并在函数体中加入自我赋值的判断。以下是一个示例:
class MyClass {
public:
MyClass& operator=(const MyClass& rhs) {
if (this == &rhs) { // 自我赋值的判断
return *this;
}
// 处理非自我赋值的情况
return *this;
}
};
在上面的代码中,如果 this 和 rhs 地址相同,就说明这是一个自我赋值的情况,此时直接返回自身即可。否则,就需要对 rhs 的值进行处理。
需要注意的是,如果 MyClass 包含指针成员,在处理非自我赋值的情况时,需要先释放原先指向的内存空间,再进行新的内存分配和复制操作。以下是一个示例:
class MyClass {
public:
MyClass() : ptr(nullptr) {}
MyClass(const MyClass&