我正在处理涉及插值的项目,我已将插值函数作为类实现,当我尝试运行我的分段插值算法时,我收到以下错误消息:{{ 1}}带有内存地址。
我的主要功能的相关部分是:
free(): invalid next size(fast)
...
double * xx = new double [n];
xx[0] = a;
xx[n - 1] = b;
for (int i=1; i<n - 1; i++) xx[i] = (rand() % 1000) * (b - a) / 1000 + a;
PwLin pv1 (n, a, b, 1, xx, 1);
PwLin pv2 (n, a, b, 2, xx, 1);
PwLin pv3 (n, a, b, 3, xx, 1);
PwLin类是
cin >> x;
cout << pv1.eval(x) << '\t' << abs(f1(x, 1) - pv1.eval(x)) << endl;
cout << pv2.eval(x) << '\t' << abs(f2(x, 1) - pv2.eval(x)) << endl;
cout << pv3.eval(x) << '\t' << abs(f3(x, 1) - pv3.eval(x)) << endl;
和eval()函数是
class PwLin
{
double * xl, * yl, * h;
double a, b;
int n;
bool uni;
public:
double eval(double);
PwLin(int, double, double, int, double);
PwLin(int, double, double, int, double *, double);
~PwLin(){};
};
我搜索了一下,发现double PwLin::eval(double x)
{
int i=0;
while (x > xl[i]) i++;
if (uni == 1){
return (yl[i - 1] * (xl[i] - x) + yl[i] * (x - xl[i - 1])) / h[0]; }
else return (yl[i - 1] * (xl[i] - x) + yl[i] * (x - xl[i])) / h[i];
}
错误是由内存泄漏引起的,但我不知道它在哪里。当我运行该函数时,错误不会发生,直到我输入x值进行测试,所以它似乎是free(): invalid next size
函数而不是构造函数的问题,但我没有eval()
或while循环中的所有内存操作,我都不知道问题是什么。
呃,我上周安装了ubuntu并且不知道如何使用它,我使用的是gedit,afaik没有调试工具,如果在ubuntu中有任何更好的东西,我不会知道它是什么
答案 0 :(得分:0)
这可能无法解决您的任何问题,但......
这些行很容易导致越界访问。
int i=0;
while (x > xl[i]) i++;
您应该将它们替换为:
int i = 0;
for ( ; i < n; ++i )
{
if ( x >= xl[i] )
{
break;
}
}
在您完成xl
中的所有项目后处理此案例。
if ( i == n )
{
// can't interpolate. Do something about it.
}