【问题标题】:Crashing after using operator new[] in c++在 C++ 中使用 operator new[] 后崩溃
【发布时间】:2017-02-26 12:26:01
【问题描述】:

我有一个带有数组和大小字段的 Vector 类。当两个数组 v1 和 v2 中的每一个都具有多个元素时,在复制运算符中为该数组分配内存时会出现问题。我该如何解决?这是一个代码:

#include<iostream>
using namespace std;

class Vector 
{
private:
    unsigned size;
    double *arr;
public:
    Vector();
    Vector(double *arr, unsigned size); 
    Vector(const Vector &copy);
    Vector &operator= (const Vector &vector);
    friend Vector operator+ (const Vector &varLeft, const Vector &varRight);
    friend ostream & operator<< (ostream &output, const Vector &var);
    friend istream & operator>> (istream &input, Vector &var);
};

int unitTest();

int main()
{
    unitTest();

    system("pause");
    return 0;
}
int unitTest()
{
    Vector v1;
    cin >> v1;
    Vector v2;
    cin >> v2;
    Vector v3;

    cout << "Your Vector v1:" << endl;
    cout << v1 << endl;
    cout << "Your Vector v2:" << endl;
    cout << v2 << endl;

    cout << "Arrays +:" << endl;
    v3 = v1 + v2;
    cout << v3 << endl;

    return 0;
}
    Vector::Vector()
    {
        arr = new double[size];
    };

Vector::Vector(double *arr, unsigned size) : size(size)
{
    arr = new double[size];
    for (int i = 0; i < size; ++i)
    {
        this->arr[i] = arr[i];
    }
};

当 operator+ 返回值时,我的程序在 'arr = new double[size];' 行之后崩溃复制操作符。

Vector::Vector(const Vector &copy)
{
    size = copy.size;
    arr = new double[size];
    for (int i = 0; i < size; ++i)
    {
        arr[i] = copy.arr[i];
    }
}
Vector operator+ (const Vector &varLeft, const Vector &varRight)
{
    Vector res;
    res.size = varLeft.size;

    if (varLeft.size == varRight.size)
    {
        for (int i = 0; i < res.size; ++i)
        {
            res.arr[i] = varLeft.arr[i] + varRight.arr[i];
        }
    }
    else
    {
        cout << "Error. Vectors have different size." << endl;
    }
    return res;
}
ostream & operator<< (ostream &output, const Vector &var)
{
    for (int i = 0; i < var.size; ++i)
    {
        output << ' ';
        output << var.arr[i];
    }
    output << endl;
    return output;
}

istream & operator>> (istream &input, Vector &var)
{
    cout << "Enter size of array --> ";
    input >> var.size;
    var.arr = new double[var.size];
    for (int i = 0; i < var.size; ++i)
    {
        cout << "Enter " << i + 1 << " element --> ";
        input >> var.arr[i];
    }
    return input;
}
Vector & Vector::operator= (const Vector &vector)
{
   if (this != &vector)
   {
        if (arr != 0)
        {
            delete[]arr;
        }
        size = vector.size;
        arr = new double[size];

        for (int i = 0; i < size; ++i)
        {
            arr[i] = vector.arr[i];
        }
    }
    return *this;
}

【问题讨论】:

  • 您是否为运算符 > 实现了友好的功能?由于您使用的是对象的直接输入/输出。代码本身也有很多错误,否则会导致隐式错误。
  • 是的。我实现了,但是忘记添加到我的问题中,请稍等,我会添加它
  • MCVE 请!例如,您正在调用Vector::operator=,但我们看不到它是如何实现的。
  • 能通过他们会很棒。此外,您没有要删除 ​​arr 的 Vector 类的析构函数。你也没有初始化数组的大小,“size”..
  • 您的整个班级可以而且应该替换为std::vector&lt;double&gt;,这样不会崩溃或泄漏内存。

标签: c++ arrays class vector


【解决方案1】:

你永远不会在你的默认构造函数中初始化Vector::size,所以你的程序的行为是未定义的。在分配数组之前,您需要初始化 Vector 的大小。

此外,对于您的 operator+,您需要添加一个采用大小的 Vector 构造函数,或者在更改 res 的大小后重新分配您的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多