为什么这个C代码产生双重免费或损坏?

Edu*_*rdo 2 c memory-corruption double-free

为什么这个用于计算两个向量的内积的代码产生双重释放或损坏错误,当编译时:

ejspeiro@Eduardo-Alienware-14:~/Dropbox/HPC-Practices$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
Run Code Online (Sandbox Code Playgroud)

代码来自此参考.

// Computation of the inner product of vectors aa and bb.

#include <stdio.h>
#include <stdlib.h>

int main() {

  size_t nn = 100000000;
  size_t total_mem_array = nn*sizeof(double);

  double *aa;
  double *bb;
  double ss = 0.0;

  aa = (double *) malloc(total_mem_array);
  bb = (double *) malloc(total_mem_array);

  int ii = 0;

  for (ii = 0; ii < nn; ++ii) {
    aa[ii] = 1.0;
    bb[ii] = 1.0;
  }

  double sum1 = 0.0;
  double sum2 = 0.0;

  for (ii = 0; ii < nn/2 - 1; ++ii) {
    sum1 += (*(aa + 0))*(*(bb + 0));
    sum2 += (*(aa + 1))*(*(bb + 1));
    aa += 2;
    bb += 2;
  }
  ss = sum1 + sum2;

  free(aa);
  free(bb);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Zie*_*ezi 6

导致错误是因为传递给的值free()与返回的值不同malloc(),因为您递增aabb.

例如,为了纠正它,您可以定义两个仅用于内存管理的附加指针变量,即分配和释放.一旦他们获得了内存,就将其分配给aabb.

  • 更好的方法是对malloc进行一次调用,然后单次调用free.aa和bb的内存可以在一个块中.这是一个微优化,但它可以提高内存,并减少两次库调用. (2认同)