2016-04-16 95 views
1

我不明白如何释放工作。我知道这发生在我尝试释放内存两次时。但是,这真的让我感到困惑。munmap_chunk():无效指针错误

我试过只发布代码的相关部分。

FILE* file = fopen(path, "r"); 
if (file == NULL) 
{ 
    error(500); 
    return; 
} 

// load file's content 
BYTE* content; 
size_t length; 
if (load(file, &content, &length) == false) 
{ 
    error(500); 
    return; 
} 

这是负载温控功能

bool load(FILE* file, BYTE** content, size_t* length) 
{ 
    printf("\nLOAD STARTED\n"); 
    content = NULL; 
    BYTE *data = NULL; 
    int size = 0; 
    while(!feof(file)) 
    { 
     char ch = fgetc(file); 
     size += 1; 
     data = realloc(data, sizeof(BYTE) * (size)); 
     *(data + (size - 1)) = ch; 
    } 
    content = &data; 
    *length = size; 
    printf("\nLOAD ENDED\n"); 
    return true; 
} 

过了一会儿,我打电话免费()

printf("\nFREEING CONTENT\n"); 
// free file's content 
free(content); 
printf("\nCONTENT FREED\n"); 

printf语句FREEING CONTENT作品之后,我得到的

munmap_chunk(): invalid pointer错误。

+1

'content = &data;' - >>'* content = data;' – wildplasser

+0

'data [size] = ch;' - >'data [size ++] = ch;' – BLUEPIXY

+3

@BLUEPIXY得到了问题 - 你永远不会改变大小,所以你的数据缓冲区永远不会变大。此外,['while(!feof(file))'(几乎总是)错误](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) - *在你的代码中是错误的。 –

回答

0

这就是问题所在:

content = &data; 

它分配一个本地变量,函数返回后超出范围的地址。由于内容是一个函数参数,因此没有任何东西会写到它指向的地方。你的意思是写

*content = data; 

取而代之?如果是这样的话,你不应该设置content = NULL,因为你要使用通过load(file, &content, &length)的呼叫传递的地址。

-1

我设法解决它。 content基本上只是一个char*。所以,我想这和它的工作...

我改变content = &datacontent = &(data[0])

它的工作原理。欣赏所有投入。 :D