一些奇怪的异常抛出

时间:2019-04-18 11:36:47

标签: c++

奇怪的问题出现在我的程序中。它可以正常工作,但是在调试时会在输出的随机位置显示“抛出异常”

cout<<"Average value:"<<u3.apr();
    _getch();

有时,它甚至在main函数之后(在{}之后)引发此错误。 这很烦人,因为这些错误会在3秒后关闭程序。 (也许是因为上课,但是我正在尝试学习它;))

已尝试更改行顺序,重写类名和数组名。

#include <iostream>
#include <conio.h>

using namespace std;

class vid
{
private:
    int i, j;
    double rez, sum=0;
public:
    int size;
    double *arr = new double[size];

    double apr()
    {
        for (i = 0; i < size; i++)
        {
            sum += (*(arr + i));
        }

        return sum / size;

    }
};
int main()
{
    vid u3;
    cout << "Enter array length:";
    cin >> u3.size;
    for (int i = 0; i < u3.size; i++)
    {
        cout << "Enter array's " << i << " element:" << endl;
        cin >> *(u3.arr+i);
    }
    cout << "Your array:" << endl;
    for (int i = 0; i < u3.size; i++)
    {
        cout << *(u3.arr + i) << "\t";
    }
    cout << endl;
    cout<<"Average value:"<<u3.apr();
    _getch();
}

感谢您的帮助;)

2 个答案:

答案 0 :(得分:5)

arr是在构造u3时初始化的。

但是直到后来您才填充u3.size

因此,您的数组的长度不确定(已经是UB),以后的访问可能无效。

您将不得不更加巧妙地管理班级成员!

此类通常具有“调整大小”功能,该功能按请求的大小执行分配。不要忘记安全地取消任何先前的分配,并在必要时移植数据。您可以在网上找到许多矢量实现的示例。

确实重命名类并随机重新排序程序源代码的行并不能解决任何问题。

答案 1 :(得分:1)

在构造u3之后,才设置

u3.size。通过设置u3.size可以避免出现编译时错误。

作为一种替代解决方案,您可能需要考虑如何摆脱new调用,以及是否需要编写一个将删除arr的析构函数。

通过创建一个带有大小参数的构造函数,并通过将arr切换为std :: vector,可以允许该类保存矢量并处理内存分配和释放:

#include <iostream>
#include <vector>

using namespace std;

class vid
{
private:
    int i, j;
    double rez, sum=0;

public:
    int size;
    std::vector<double> arr;

    // constructor requires size to be passed in;
    // constructor initializes the arr array with the passed in size to zeroes.
    vid(int argSize) : size(argSize), arr(argSize, 0.0){ }

    double apr()
    {
      for (i = 0; i < size; i++)
      {
        sum += arr[i];
      }
      return sum / size;
    }
};
int main()
{
  uint size;
  cout << "Enter array length:";
  cin >> size;

  vid u3(size);

  for (int i = 0; i < u3.size; i++)
  {
    cout << "Enter array's #" << i << " element:" << endl;
    cin >> u3.arr[i];
  }
  cout << "Your array:" << endl;
  for (int i = 0; i < u3.size; i++)
  {
    cout << u3.arr[i] << "\t";
  }
  cout << endl;
  cout<<"Average value:"<<u3.apr();
  char ch;
  cin >> ch;
}