[重载运算符'='使用数组会产生运行时错误C ++

问题描述 投票:0回答:1

我正在尝试为自定义Array类设置重载运算符'='以进行练习,但似乎会导致运行时错误。

class Array {
    private:
        static int numberOfElements; //class static variable
        int size;
        int* numbers;

    public:
        Array(int);
        Array(const Array&);
        ~Array();

        int getSize();
        static int getNumberOfElements();

        Array& operator =(const Array&);
};

此重载的运算符函数会产生正确的输出,但会出现运行时错误:

Array& Array::operator =(const Array& newArray) {
    numberOfElements = numberOfElements - size + newArray.size;
    size = newArray.size;
    for (int i = 0; i < size; i++)
        numbers[i] = newArray.numbers[i];
    return *this;
}

之前,我有

Array& Array::operator =(const Array& newArray) {
    delete[] numbers;
    numberOfElements = numberOfElements - size + newArray.size;
    size = newArray.size;
    numbers = new int[size];
    for (int i = 0; i < size; i++)
        numbers[i] = newArray.numbers[i];
    return *this;
}

不会产生运行时,但是会创建一个充满垃圾的数组。 numberOfElements只是跟踪所有Array中的元素总数,不应成为错误的一个因素。我确定问题是动态分配,但是我似乎无法从逻辑上弄清楚为什么如果我只用newArray覆盖原始数组,为什么会抛出运行时,以及为什么即使分配的数组被设置为newArray的元素。

c++ arrays operator-overloading overloading dynamic-memory-allocation
1个回答
0
投票

您的operator=实现错误。如果newArray大于this,则正在浪费内存。您需要重新分配numbers[]数组,以解决最初要执行的较大操作(只是不采用异常安全的方式)。

尝试更多类似的事情(假设您的构造函数正确分配了numbers[]:]

Array::Array(int num)
{
    size = num;
    numbers = new int[size];
    numberOfElements += size;
}

Array::Array(const Array &srcArray)
{
    size = src.size;
    numbers = new int[size];
    for (int i = 0; i < size; ++i)
        numbers[i] = srcArray.numbers[i];
    numberOfElements += size;
}

Array::~Array()
{
    delete[] numbers;
    numberOfElements -= size;
}

#include <algorithm>
Array& Array::operator=(const Array& newArray)
{
    if (this != &newArray)
    {
        if (size != newArray.size)
        {
            Array tmp(newArray);
            std::swap(numbers, tmp.numbers);
            std::swap(size, tmp.size);
        }
        else
        {
            for (int i = 0; i < size; ++i)
                numbers[i] = newArray.numbers[i];
        }
    }

    return *this;
}
© www.soinside.com 2019 - 2024. All rights reserved.