如何解决C中的unlink函数是否也会取消分配内存?
所以我正在其中一个程序中浏览一段代码,它使用了unlink函数,其中
hist_name = malloc(128)
但是,我确实注意到该程序没有使用“ free”来释放内存,但是在程序结尾处确实具有如下所示的unlink函数:
unlink(hist_name);
我的问题是,除删除指向文件的链接之外,取消链接功能还可以释放内存吗?还是需要插入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]='\0';
unlink(hist_name);
}
在下面,向您展示,取消链接不会释放您分配的内存,我将使用valgrind。 Valgrind是一个工具,可让您检测内存泄漏和其他内存问题(如越界访问,使用未初始化的值等)
因此,如果使用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)
绝对丢失:1个块中的128个字节
这意味着,您一次分配了128个字节的内存,但没有释放它。 ==>取消链接不会为您释放内存。
,简短回答-否
unlink
函数仅更改文件系统,而不更改堆或分配的内存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。