我有一个从函数返回的值,它是一个指向malloc地址的指针,该地址存储了一个字符串值,这个字符串值就是我想要返回的值,但是为了防止泄漏,我需要释放这个地址,这反过来又会使我丢失想要返回的值。
我试着创建一个tmp
指针来解决这个问题,但是我认为我做错了什么。这里有一个小代码片段,其中line
是需要释放的,但是它的值也需要返回。
char *get_next_line(int fd)
{
static char *storage;
char *buffer;
char *line;
char *tmp;
tmp = NULL;
line = NULL;
if (!fd || BUFFER_SIZE <= 0)
return (NULL);
read_to_buffer(fd, &buffer, &storage);
free(buffer);
tmp = line;
line = extract_line(storage); // extract_line() returns a malloc'd pointer.
free(&tmp);
return (line);
}
2条答案
按热度按时间t30tvxxf1#
提供一个缓冲区,而不是分配一个缓冲区然后返回它,这总是一个好主意。如果你写了一个函数,并且这个函数返回了一个分配的缓冲区,你不能确定这个缓冲区是否会被释放。
因此,函数应该接受一个缓冲区(和它的大小)并使用该缓冲区。规范可以允许传递一个
NULL
指针,让函数分配一个缓冲区(它必须由用户通过指定的函数释放,例如free
)。例如:
第二个版本还具有重用单个缓冲区的优点,而不是在每次调用时分配缓冲区。
“* 聪明的人解决问题,聪明的人避免问题 *”
爱因斯坦
vojdkbi02#
在上面的代码中,
tmp
和line
都指向同一个内存。因此,当tmp
被释放时,line
所指向的内存也被释放。在line
被释放后,任何使用tmp
的尝试都将导致未定义的行为。从C11,内存管理功能:
free()
:....否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已被free或realloc调用释放,则行为未定义。
回复:
但是为了防止泄漏,我需要释放相同的地址,这反过来又会使我丢失想要返回的值。
C不允许你在内存被释放后使用它。如果你必须返回它,没有必要在这个函数中
free()
内存。它只会导致内存泄漏,如果你在完成它后忘记free()
内存(在调用函数中)。其中line是需要释放的内容,但它的值也需要返回。
如果
line
指向的内存需要进一步处理,那么就没有必要在函数get_next_line
中释放它。旁白:
free(&tmp);
应该是free (tmp);
。并且return
语句后面的括号是多余的。