【问题标题】:Can I reuse the buffer in open_memstream我可以重用 open_memstream 中的缓冲区吗
【发布时间】:2020-11-18 13:17:48
【问题描述】:

在循环工作时,我想多次重复使用已经分配的缓冲区:

char *membuf = NULL;
size_t size = 0;
while(1) {
    FILE *f = open_memstream(&membuf, &size);

    uint8_t iobuf[8192];
    int32_t readbytes = 0;

    // some I/O here
    while(readbytes = read(/*some I/O params here*/) != 0) {
        fwrite(iobuf, sizeof(uint8_t), readbytes, f); 
    }

    fclose(f);

    // process message, once done, loop for next message
    // explicitly NO free of membuf!
}

这可能吗?或者这会导致UB?

【问题讨论】:

  • 动态分配内存并在不释放的情况下将其丢弃会导致内存泄漏。如果你这样做太久,程序可能会由于内存不足而崩溃。在更糟糕的情况下,系统可能会进行过多的交换,而不是仅仅使单个应用程序崩溃,而整个系统可能会变慢。

标签: c stream posix stdio


【解决方案1】:

不,您不能使用open_memstream 执行此操作,但这样做不会导致 UB,而是会导致内存泄漏。 man 3 open_memstream 说“函数动态分配缓冲区”和“关闭流后,调用者应该 free(3) 这个缓冲区。”您编写的代码将用新的分配覆盖循环的每次迭代membuf,从而阻止您释放旧的。它不会像您希望的那样重用旧分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-04-18
    相关资源
    最近更新 更多