free()出错:下一个大小无效(快)

时间:2015-02-13 21:14:58

标签: c++ memory memory-management free ubuntu-14.04

我正在处理涉及插值的项目,我已将插值函数作为类实​​现,当我尝试运行我的分段插值算法时,我收到以下错误消息:{{ 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中有任何更好的东西,我不会知道它是什么

1 个答案:

答案 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.
}