一些奇怪的异常抛出

Some weird exception throws

本文关键字:异常      更新时间:2023-10-16

奇怪的问题出现在我的程序中。它正在工作,但在调试中,它在输出的随机位置显示"抛出的异常">

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

有时,它甚至在主函数之后抛出此错误(在 {} 后面(这很烦人,因为由于这些错误,程序会在 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();
}

感谢您的任何帮助;)

arr

构造u3时初始化。

但直到后来你才填充u3.size

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

你将不得不更聪明地管理你的班级成员!

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

当然,重命名类并随机重新排序程序源代码的行不会解决任何问题。

u3.size直到u3被构造之后才会设置。 通过设置 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;
}