MST

星途 面试题库

面试题:C++赋值运算符重载中的自我赋值处理

假设有一个C++类`ResourceClass`,它包含一个动态分配的数组作为成员变量。编写该类的赋值运算符重载函数,要求正确处理自我赋值的情况,同时进行适当的内存管理,避免内存泄漏。请给出完整的类定义以及赋值运算符重载函数的实现代码,并解释自我赋值检测的重要性。
15.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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;
    }
};

自我赋值检测的重要性

  1. 避免内存释放问题:如果不检测自我赋值,在执行 delete[] data; 时,可能会释放掉正要赋值的对象的内存,导致数据丢失和程序崩溃。例如,a = a; 这种情况,如果不检测,a 的内存会被释放,后续的 new 操作会在已经释放的内存上进行,引发未定义行为。
  2. 提高效率:自我赋值时不需要进行复杂的内存重新分配和数据拷贝操作,直接返回对象自身引用可以避免不必要的开销,提高程序运行效率。