面试题答案
一键面试可能出现的问题
- 内存泄漏:如果在赋值运算符重载函数中直接释放旧的资源并重新分配新资源,而没有检查自赋值,当对象给自己赋值时,释放旧资源后就无法再访问到对象本身,导致内存泄漏。例如:
class MyClass {
private:
int* data;
public:
MyClass(int value) {
data = new int(value);
}
~MyClass() {
delete data;
}
// 错误的赋值运算符重载,未处理自赋值
MyClass& operator=(const MyClass& other) {
delete data;
data = new int(*other.data);
return *this;
}
};
在上述代码中,如果有MyClass a(10); a = a;
这样的自赋值操作,delete data
会释放a
的data
,后续new int(*other.data)
时other
就是a
本身,此时a
的data
已被释放,导致内存泄漏。
- 数据损坏:除了内存泄漏,还可能导致对象内部数据损坏,使得对象处于不一致或不可用的状态。
正确处理自赋值的代码示例
class MyClass {
private:
int* data;
public:
MyClass(int value) {
data = new int(value);
}
~MyClass() {
delete data;
}
// 正确处理自赋值的赋值运算符重载
MyClass& operator=(const MyClass& other) {
if (this == &other) {
return *this;
}
delete data;
data = new int(*other.data);
return *this;
}
};
在上述代码中,通过if (this == &other)
检查是否为自赋值,如果是则直接返回*this
,避免了释放自身资源等错误操作,正确处理了自赋值情况。