【问题标题】:Memory leaks when free data?空闲数据时内存泄漏?
【发布时间】:2017-04-16 02:15:12
【问题描述】:

我正在用 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;
}

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

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

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

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

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

【问题讨论】:

  • "我正在用 C 语言编写程序" - 那么有什么理由向 C++ 标签发送垃圾邮件?
  • 使用调试器获取stream.out的值。检查 compress() 之后的值。检查函数内的值。它们都应该是相同的。
  • @EdHeal 强制转换可能很糟糕,但无论何时传递给 malloc 的大小是正确的。而且,我使用 Visual Studio,我转换它是因为如果没有转换,编译器会出错。
  • “我使用 Visual Studio,我将其转换为因为如果没有转换编译器会出错。”。那是因为您使用的是 C++ 编译器。如果您使用 C 编写代码,请使用 C 编译器。

标签: c memory-management memory-leaks


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多