当前位置:首页 > 内存 > 正文

内存的申请与释放总结

  • 内存
  • 2024-08-12 12:16:06
  • 1048

一、看C语言的书中说“释放存储空间”,是什么意思?什么叫做释放,为什么叫释放这是通知操作系统先前请求的变量的指定部分所使用的空间不再使用,并将使用权返回给操作系统以分配给其他程序。dispose(p)的意思是将变量p所代表的空间返回给操作系统(本来是申请给操作系统供本程序使用的,操作系统不会将其分配给其他程序)。
二、C语言,为什么动态内存分配申请后,还要再释放?1.即使没有free(),malloc()的内存也会在main()结束时自动释放。这里的监视器就是操作系统。设计良好的操作系统会记录分配给每个应用程序的每一块内存,这使您即使在应用程序本身失控时也可以有效地回收内存。您可以尝试在任务管理器中强制终止您的程序。这样,程序本身的free()操作显然没有被执行,但是内存并没有泄漏。
()的目的是实时回收内存。如果你的程序很简单,不写free()也没关系。在程序完成之前,您不会使用大量内存,也不会降低系统性能,系统会为您完成它。但是当你开始开发大型程序时,你会发现不写free()的后果是非常严重的。很可能你的程序需要分配10M内存10k次,如果每次使用后都使用free()释放内存,那么你的程序只需要占用10M内存即可运行;free()时,程序在完成之前将消耗100GB内存。这显然包括大部分虚拟内存,并且由于虚拟内存需要从磁盘读写才能发挥作用,因此这极大地影响了系统性能。结果,系统很可能崩溃。
3.任何时候为每个malloc()编写相应的free()是一种很好的编程习惯。这不仅体现在管理大型程序的需要上,还体现在程序优秀的风格和健壮性上。毕竟,只有您的程序知道您为哪些操作分配了哪些内存以及何时不再需要它。因此,这段内存显然最好由你自己的程序来恢复。


三、用户空间内存动态申请?动态向用户空间申请内存的函数是malloc()。该函数在不同操作系统中一致使用。释放malloc()请求的内存的函数是free()。对于Linux,C库的malloc()函数通常通过两个系统调用brk()和mmap()从内核申请内存。由于C用户空间库的malloc算法实际上具有二级管理能力,因此并不是每次申请和内存释放都必须伴随对内核的系统调用。例如,代码清单11.2中的应用程序可能在从内核获取内存后立即调用free()。由于free()之前被称为malopt(M_TRIM_THRESHOLD,1)和malopt(M_MMAP_MAX,0),所以这个free()不是的。内存会返回给内核,但只是根据C库的分配算法(内存仍然属于这个进程),因此所有后续的申请和动态内存释放都将在用户模式下完成。另外,Linux内核始终使用请求分页,因此当malloc()返回时,即使它成功返回,内核实际上并不提供进程内存。如果此时读取请求的内存,则所有内容都不会被提供。丢失的。如果为0,则该页的映射是只读的。仅当写入某个页面时,内核才会在页面错误后真正使该页面可供进程使用。
Linux内核空间中与内存采用相关的函数主要有kmalloc()、getfreepages()和vmalloc()等
。kmalloc()和_get_freepages()(以及类似函数)申请的内存位于DMA和常规区域的映射范围内,并且在物理上也是连续的。因此,它们与真实物理地址之间的距离是固定的。有一个大问题。vmalloc()在虚拟内存空间中提供了一块连续的内存区域,实际上,这个连续的虚拟内存在物理内存中并不一定是连续的,并且vmalloc()所申请的虚拟内存和物理内存之间没有简单的关系。换算关系