gpt4 book ai didi

c - malloc 和 free 的错综复杂

转载 作者:太空狗 更新时间:2023-10-29 16:08:44 26 4
gpt4 key购买 nike

我有两个相关的问题,因此我在这个单独的线程中问他们。

问题 1)我如何确认我的操作系统是否在程序终止时自动清除未“释放”的内存(使用 malloc 分配)?我正在使用带有 gcc-4.5.2 的 32 位 Ubuntu 11.04

根据 Steven Summit 的教程页面 here , "释放未使用的内存 (malloc'ed) 是个好主意,但这不是强制性的。当您的程序退出时,它已分配但未释放的任何内存都应自动释放。如果您的计算机不知何故 ``丢失“内存只是因为您的程序忘记释放它,这表明您的操作系统存在问题或缺陷

Q2) 假设,foo.c 分配了 B 字节的内存。稍后,foo.c 释放这个 B 字节的内存位置并将其返回给操作系统。 现在我的问题是,是否可以在当前实例中将那些特定的 B 字节内存位置重新分配给 foo.c(由操作系统),或者这些 B 字节不能分配给 foo .c 直到其当前实例终止?

编辑:我建议所有阅读我的问题的人阅读类似问题的答案 herehere .这两个答案都非常详细地解释了 malloc() 和 free() 的交互和工作,而没有使用非常深奥的术语。了解内核使用的内存管理工具(例如 brk()、mmap())与 C 编译器使用的内存管理工具(例如 malloc()、free())之间的区别,this必读。

最佳答案

当进程通过终止信号结束时,例如SIGSEGV,或通过 _exit(2)系统调用(从 main 返回时恰好也被调用),所有进程资源都由内核释放。特别是,释放了进程地址空间,包括堆内存(分配给 mmap(2)(或者 sbrk(2))系统调用(由 malloc 库函数使用)。

当然,free 库函数要么(通常)使释放的内存区域在以后调用 malloc 时可重用,要么(偶尔,对于大内存区域)释放使用例如内核的一些大内存块munmap(2) 系统调用。

要了解有关进程 1234 的内存映射的更多信息,请从内部顺序阅读 /proc/1234/maps 伪文件(或 /proc/self/maps过程)。 /proc文件系统是查询内核有关进程的首选方式。 (还有 /proc/self/statm/proc/self/smaps 以及许多其他有趣的东西)。

freemalloc 的详细行为取决于实现。您应该将 malloc 视为获取堆内存的一种方式,将 free 视为一种表示先前 malloc ed 区域无用的方式,系统(即标准 C 库 + 内核)可以用它做任何想做的事。

使用valgrind寻找内存泄漏错误。您也可以考虑使用 Boehm's conservative garbage collector ,即使用 GC_malloc 而不是 malloc 并且不必为手动释放内存而烦恼。

关于c - malloc 和 free 的错综复杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10311252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com