微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中的unlink函数是否也会取消分配内存?

如何解决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 举报,一经查实,本站将立刻删除。