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
函数仅更改文件系统 - 不更改堆或分配的内存。
所以我正在检查其中一个程序中的一段代码,它使用了一个 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
函数仅更改文件系统 - 不更改堆或分配的内存。