MST

星途 面试题库

面试题:C++赋值运算符常见问题之中等难度

在C++中,自定义类的赋值运算符重载函数如果没有正确处理自赋值情况,可能会出现什么问题?请举例说明,并给出正确处理自赋值的代码示例。
44.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 内存泄漏:如果在赋值运算符重载函数中直接释放旧的资源并重新分配新资源,而没有检查自赋值,当对象给自己赋值时,释放旧资源后就无法再访问到对象本身,导致内存泄漏。例如:
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会释放adata,后续new int(*other.data)other就是a本身,此时adata已被释放,导致内存泄漏。

  1. 数据损坏:除了内存泄漏,还可能导致对象内部数据损坏,使得对象处于不一致或不可用的状态。

正确处理自赋值的代码示例

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,避免了释放自身资源等错误操作,正确处理了自赋值情况。