You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存malloc分配指针的值,释放指针后仍能返回初始值?

问题解决思路

首先明确核心逻辑:你要返回extract_line()分配的堆内存字符串,就不能在当前函数里释放它——内存释放的责任应该交给调用get_next_line的代码。如果在函数里释放,返回的就是无效的野指针,必然丢失数据。

再看你代码里的错误:

  • tmp = line这步完全多余,此时line是NULL,tmp也变成NULL,对后续逻辑没有任何帮助。
  • free(&tmp)是严重错误:tmp是栈上的局部变量,&tmp是栈地址,free只能用来释放堆上malloc/calloc/realloc分配的内存,释放栈内存会触发未定义行为(大概率程序崩溃)。

正确的代码应该删掉多余的tmp相关操作,直接返回extract_line的结果,让调用方负责释放:

char *get_next_line(int fd)
{
    static char *storage;
    char *buffer;
    char *line;

    line = NULL;
    if (!fd || BUFFER_SIZE <= 0)
        return (NULL);

    read_to_buffer(fd, &buffer, &storage);
    free(buffer); // buffer是堆内存,这里释放没问题

    line = extract_line(storage); // 拿到malloc分配的字符串
    // 这里不能释放line,要把它返回给调用方
    return (line);
}

调用示例(调用方负责释放):

int main()
{
    int fd = open("test.txt", O_RDONLY);
    if (fd == -1)
        return 1;
    
    char *line;
    while ((line = get_next_line(fd)) != NULL)
    {
        printf("%s\n", line);
        free(line); // 调用方释放,避免内存泄漏
    }
    close(fd);
    return 0;
}

另外要注意:storage是静态指针,如果它指向堆内存,要确保在合适的时机释放(比如程序结束前,或者不再使用这个函数时),否则也会导致内存泄漏。

内容的提问来源于stack exchange,提问作者Daly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:15:42