free():几次调用后无效的下一个大小(快)

时间:2018-05-07 04:34:42

标签: c++ free dynamic-allocation

我完全不确定此函数如何可能存在内存分配错误。

template <typename T, typename U> // x -> ax+b
void transform_coords(double a, double b, int n, const T* oldc, U* newc) {
  int i, j, q0, q;
  if (n<2) return;

  int *p = new int[n]; // Pascal's triangle
  p[0] = 1;
  for (i=1; i<n; ++i) p[i] = 0;
  for (i=0; i<n; ++i) newc[i] = 0;

  for (j=0; j<n; ++j) {
    for (i=0; i<n; ++i) {
      if (p[i]==0) break;
      double m = p[i];
      if (i!=j) m *= std::pow(a,j-i);
      if (i!=0) m *= std::pow(b,i);
      newc[i] += m * oldc[j];
    }
    for (i=1, q=1; q; ++i) {
      q0 = p[i];
      p[i] += q;
      q = q0;
    }
  }

  delete[] p;
}

第三次来电中,我得到了

*** glibc detected *** ./bin/bin_var: free(): invalid next size (fast)

如果我发表评论delete[] p;,它会在所有电话中正常运行。

据我所知,关于内存分配,此功能相当于

void transform_coords(int n) {
  if (n<2) return;
  int *p = new int[n];
  delete[] p;
}

1 个答案:

答案 0 :(得分:1)

问题出在你的一个循环中。正如上的in this post错误:free():无效的下一个尺寸(快):

  

您可能会溢出缓冲区或以其他方式写入您不应该写入的内存,从而导致堆损坏。

我最好的猜测就是这个循环:

for (i=1, q=1; q; ++i) {
  q0 = p[i];
  p[i] += q;
  q = q0;
}

如果p数组未被0终止,则会覆盖堆中的内存。

话虽如此,如果你使用std::vector而不是手动分配的数组,你的代码会更加清晰。