如何保存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
相关产品推荐
相关产品推荐

