c - 释放数据时内存泄漏?

标签 c memory-management memory-leaks

我正在用 C 编写一个程序来解码数据。数据已压缩,因此我尝试解压缩数据并通过解压得到正确的结果成功。然后,我将解压后的数据传递给其他进程。此过程分配新数据,从传入的数据中读取,写入新数据,然后释放旧数据(因为它将不再使用)。但是,运行时,它会在“free()”调用行中生成错误“decode.exe 已触发断点”。 我的代码是:

int decode (uint8_t* data, uint32_t size) {
    compressed_stream stream;
    stream.data = data;
    stream.data_size = size;

    uint32_t outsize;
    //Compute output size and assign to outsize
    //...
    stream.out = (uint8_t*)malloc(outsize);
    stream.size = outsize;

    stream.inpos = stream.outpos = 0;
    decompress(&stream);
    //Not free stream.data yet
    process(stream.out);
    return 0;    //Handling error later
}

“decompress()”函数经过测试,它不会尝试更改分配的输出数据的指针。我的数据没有错误,计算出的“outsize”等于输出所需的大小,“malloc()”返回非空数据

并且,过程如下:

int process(uint8_t* data)
{
    //Process data here, assign it to global scope pointers for easy handling
    //...
    free(data);
    return 0;
}

同样,处理后的数据经过测试,没有出现错误。但是当到达“免费(数据)”行时我崩溃了。

我尝试不使用“process()”函数并在“decompress()”之后释放与stream.out关联的数据。但它还是发生了。 但是当我尝试更改“免费(数据);”时至:

realloc(data, 1);
free(data);

没有发生错误。或者,当我更改“outsize”值时,该值远大于在没有重新分配数据的情况下输出解压缩数据所需的值,也没有错误。

我不知道“malloc()”和“free()”函数发生了什么。我的程序工作正常,它产生我需要的数据,但我想优化它使用的内存。感谢您的帮助或解释!

最佳答案

现在我发现问题是什么,我的“decompress()”函数写入的字节数超过了“malloc()”为输出分配的内存大小。它没有像我预期的那样生成错误。非常感谢@Nguai al 的评论。我尝试在处理之前存储内存的位置,解压时修改位置,然后进行减法。然后,我发现它比我之前分配的内存大小还要大。

关于c - 释放数据时内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43433053/

相关文章:

.net - 将 FFMpeg 编译为 .net 可执行文件

c - 消除c中图像旋转的舍入误差

c - 如何解析用 C 引号引起来的单词?

c - UART1_Write(13) 无法正常工作

python - 为什么此 python 代码中的内存使用量增加?

c - 将新节点分配给树节点时程序崩溃

Java收集和内存优化

jquery - 关于 jquery、闭包和可能的内存泄漏

c - 编写我自己的内存管理器

c# - SqlCommand.Dispose() 没有处理其中的 SqlParameters - 内存泄漏 - C#.NET