【问题标题】:Valgrind showing "invalid write of size 4 at fread" and memory leaksValgrind 显示“在 fread 时写入大小为 4 的无效写入”和内存泄漏
【发布时间】:2016-07-24 19:24:21
【问题描述】:

下面的load 函数尝试加载指针file 指向的文件内容,并将其位置保存在content,长度保存在length。代码运行良好,但 Valgrind 在使用 realloc 时显示“invalid write at 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;
}

【问题讨论】:

    标签: c memory-leaks valgrind fread


    【解决方案1】:

    你的问题在这里:

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

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

    重要提示:不要重新分配回您传递给realloc 函数的指针,请使用临时变量。那么如果realloc 失败,你不会丢失原来的指针并且可以优雅的清理。

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多