奇怪的问题出现在我的程序中。它可以正常工作,但是在调试时会在输出的随机位置显示“抛出异常”
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();
}
感谢您的帮助;)
答案 0 :(得分:5)
arr
是在构造u3
时初始化的。
但是直到后来您才填充u3.size
。
因此,您的数组的长度不确定(已经是UB),以后的访问可能无效。
您将不得不更加巧妙地管理班级成员!
此类通常具有“调整大小”功能,该功能按请求的大小执行分配。不要忘记安全地取消任何先前的分配,并在必要时移植数据。您可以在网上找到许多矢量实现的示例。
确实重命名类并随机重新排序程序源代码的行并不能解决任何问题。
答案 1 :(得分:1)
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;
}