使用赋值运算符时有时会出现自我赋值的情况。当对于某个类重载=并进行自我赋值时,会出现一些问题。
问题来源
当类中有指针型属性时,重载的=运算符由于需要深拷贝指针型属性,会先对原属性内存进行一次释放再重新分配并赋值来避免内存泄漏。而先行的释放操作会使该对象短暂丢失本身数据,自我赋值时便会出现赋值错误,所以重载=时必须考虑该问题。解决方法是使用this指针判断传入的参数是否为自身。
代码示例
#include <iostream>
#include<vector>
class Test1{
int* a;
std::vector<double>b;
public:
explicit Test1(int a): a(new int(a)){}
//重载 =
Test1& operator = (const Test1& k) noexcept(true) {
if(this == &k){//处理自我赋值问题
return *this;
}
if(a){//清空值
delete(a);
a = nullptr;
}
a = new int(*k.a);
a = k.a;
b = k.b;
return *this;
}
~Test1(){
if(a){
delete(a);
a = nullptr;
}
}
};
int main(){
Test1 p1(1);
Test1 p2(2);
p2 = p1;
}