我正在尝试为自定义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的元素。
您的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;
}