Valgrind显示“在fread上无效写入大小4”和内存泄漏

时间:2016-07-24 19:24:21

标签: c memory-leaks valgrind fread

下面的load函数尝试加载指针file指向的文件内容,并将其位置保存在content,长度保存在length。代码工作正常,但Valgrind在使用realloc时显示“在fread时写入无效”和几次内存泄漏的错误。

以下是代码:

bool load(FILE* file, BYTE** content, size_t* length) {
    // providing default values to content and length
    *content = NULL;
    *length = 0;

    // initializing buffer to hold file data
    int size = 512;
    BYTE* buffer = NULL;
    buffer = malloc(size);
    if(buffer == NULL)
        return false;

    // bytes_read will store bytes read at a time    
    int bytes_read = 0;

    // reading 512 bytes at a time and incrmenting writing location by 512
    // reading stops if less than 512 bytes read
    while((bytes_read = fread(buffer + size - 512 , 1, 512, file)) == 512)
    {
        //increasing the size of 
        size = size + 512;
        if(realloc(buffer,size) == NULL)
        {
            free(buffer);
            return false;
        }
    }

    // undoing final increment of 512 and increasing the size by bytes_read on last iteration
    size = size - 512 + bytes_read;

    // triming buffer to minimum size
    if(size > 0)
    {
        BYTE* minimal_buffer = malloc(size + 1);
        memcpy(minimal_buffer, buffer, size);
        minimal_buffer[size] = '\0';
        free(buffer);    
        *content = minimal_buffer;
        *length = size;
        return true;
    }

    return false;
}

1 个答案:

答案 0 :(得分:3)

你的问题在这里:

if(realloc(buffer,size) == NULL)

重新分配缓冲区,但不保存新指针。 realloc函数可以分配一个新的内存区域并在那里复制数据。它返回新指针。

一个重要的注意事项:不要重新分配给传递给realloc函数的指针,使用临时变量。然后,如果realloc失败,您将失去原始指针,并且可以优雅地清理。