如果在C ++中的malloc()之后调用free(),则会出现错误

时间:2017-03-27 20:11:11

标签: c++ memory malloc

我为数组I调用test分配空间,它将具有double类型的(2 * n + 1)个元素。我填充数组,最后我释放()它。但如果我使用free(),我会收到一个错误:“double free or corruption(out):0x0000000000000f1dc20”。如果我评论free(),代码就会运行。我无法发现这个问题。

using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

long    n=512; //grid size
double *test;

int main() 
{
    test = (double*) malloc(sizeof(double) * (2*n+1));

    for (long j=-n;j<=n;j++)
    {
        test[j] = double(j);
    }

    free(test); //<--- gives me error if I use this
    return 0;
 }

1 个答案:

答案 0 :(得分:3)

不,那就是不行。

为2n的双精度数组分配足够的空间,但C定义范围为[​​0..2n-1]的数组索引。您不能随意决定使用[-n .. + n]访问元素。正如评论中已经描述的那样,它是未定义的行为

如果你需要做你似乎正在做的事情,你将不得不为所有访问使用偏移量,例如:

test[j+n] = double(j);

然后你有更好的机会不破坏你的堆结构,从而从你的C和/或OS内存管理器那里得到恼人的错误消息。