如何存储malloc指针的值,以便在释放指针时仍能返回它最初持有的值?

4uqofj5v  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(120)

我有一个从函数返回的值,它是一个指向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);
}
t30tvxxf

t30tvxxf1#

提供一个缓冲区,而不是分配一个缓冲区然后返回它,这总是一个好主意。如果你写了一个函数,并且这个函数返回了一个分配的缓冲区,你不能确定这个缓冲区是否会被释放。
因此,函数应该接受一个缓冲区(和它的大小)并使用该缓冲区。规范可以允许传递一个NULL指针,让函数分配一个缓冲区(它必须由用户通过指定的函数释放,例如free)。
例如:

//instead
char* get_next_line(int fd);

//do
char* get_next_line(int fd, char *dst, int dst_len);

第二个版本还具有重用单个缓冲区的优点,而不是在每次调用时分配缓冲区。
“* 聪明的人解决问题,聪明的人避免问题 *”
爱因斯坦

vojdkbi0

vojdkbi02#

tmp = line;
line = extract_line(storage); // extract_line() returns a malloc'd pointer.
free(&tmp);
return (line);

在上面的代码中,tmpline都指向同一个内存。因此,当tmp被释放时,line所指向的内存也被释放。在line被释放后,任何使用tmp的尝试都将导致未定义的行为。
从C11,内存管理功能:
free()
....否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已被free或realloc调用释放,则行为未定义。
回复:
但是为了防止泄漏,我需要释放相同的地址,这反过来又会使我丢失想要返回的值。
C不允许你在内存被释放后使用它。如果你必须返回它,没有必要在这个函数中free()内存。它只会导致内存泄漏,如果你在完成它后忘记free()内存(在调用函数中)。
其中line是需要释放的内容,但它的值也需要返回。
如果line指向的内存需要进一步处理,那么就没有必要在函数get_next_line中释放它。
旁白:free(&tmp);应该是free (tmp);。并且return语句后面的括号是多余的。

相关问题