C 中的 unlink 函数是否也释放内存?

Does the unlink function in C deallocate memory as well?

所以我正在检查其中一个程序中的一段代码,它使用了一个 unlink 函数,其中

hist_name = malloc(128)

不过,我确实注意到程序没有使用“free”来释放内存,但它在程序末尾确实有如下所示的 unlink 函数:

unlink(hist_name);

我的问题是,unlink函数除了删除文件的link外,是否释放内存,还是还需要插入一个free(hist_name)语句来释放内存?

unlink 不释放内存。如果要释放hist_name指向的内存,应该把地址传给free.

unlink() 删除文件。更具体地说,它取消给定名称与磁盘上内容的链接,并且当没有更多名称链接到某些内容时,内容将自动回收(即文件真正删除)。

它不会释放任何内存。为此使用 free()(当然在 unlink() 之后)。但是在程序结束之前释放内存在典型的操作系统上并不重要,它会在进程终止时自动回收进程使用的所有内存。

没有。 hist_name 泄露。 unlink 不会释放参数。

创建一个名为“a”的文件和运行此代码(使用gcc test.c编译):

#include <unistd.h>
#include <stdlib.h>

int main(void){
    char* hist_name=malloc(128);
    //Fill hist_name
    hist_name[0]='a';
    hist_name[1]='[=10=]';
    unlink(hist_name);
}

在下文中,为了向您展示取消链接不会释放您分配的内存,我将使用 valgrind。 Valgrind 是一个允许您检测内存泄漏和其他内存问题(如 out-of-bounds 访问、使用未初始化值等)的工具

所以,如果你 运行 使用 valgrind (valgrind ./a.out) 这个程序,你会得到这个输出:

==2155== Memcheck, a memory error detector
==2155== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2155== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2155== Command: ./a.out
==2155== 
==2155== 
==2155== HEAP SUMMARY:
==2155==     in use at exit: 128 bytes in 1 blocks
==2155==   total heap usage: 1 allocs, 0 frees, 128 bytes allocated
==2155== 
==2155== LEAK SUMMARY:
==2155==    definitely lost: 128 bytes in 1 blocks
==2155==    indirectly lost: 0 bytes in 0 blocks
==2155==      possibly lost: 0 bytes in 0 blocks
==2155==    still reachable: 0 bytes in 0 blocks
==2155==         suppressed: 0 bytes in 0 blocks
==2155== Rerun with --leak-check=full to see details of leaked memory
==2155== 
==2155== For lists of detected and suppressed errors, rerun with: -s
==2155== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

definitely lost: 128 bytes in 1 blocks

这意味着,您分配了一次内存,128 字节,但没有释放它。 ==> 取消链接不会为您释放内存。

简答 - 否

unlink 函数仅更改文件系统 - 不更改堆或分配的内存。