当程序终止使用非空闲的malloc分配的内存时';预计起飞时间?
假设我有以下程序当程序终止使用非空闲的malloc分配的内存时';预计起飞时间?,c,memory-leaks,malloc,free,valgrind,C,Memory Leaks,Malloc,Free,Valgrind,假设我有以下程序 #include <stdio.h> #include <stdlib.h> int main(void) { int * i; if ((i = malloc(sizeof(int) * 100)) == NULL) { printf("EROOR: unable to allocate memory \n"); return -1; } /* memory is allocate
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * i;
if ((i = malloc(sizeof(int) * 100)) == NULL) {
printf("EROOR: unable to allocate memory \n");
return -1;
}
/* memory is allocated successfully */
/* memory is not free'ed but program terminates */
// free(i);
return 0;
}
问题:
当程序终止时,已分配但未释放的内存会发生什么变化
更新:
考虑到这个代码在不同的操作系统上执行,比如说Windows、Linux、Salix、MaOS等。在终止时,这个代码的行为有什么不同吗? < P>程序一旦退出,操作系统就会恢复内存。 操作系统不知道你的程序泄漏了内存,它只是将内存分配给程序运行,一旦程序退出,它就会回收内存 但是,操作系统可能会/可能不会重新限制文件描述符等其他资源,从而导致资源泄漏
因此,一个程序在退出之前应该清理它使用的所有资源,这是一个很好的做法。O.S.将回收未释放的内存
但是释放malloc分配的所有内存是一种很好的做法。当进程动态分配内存时,它会从操作系统借用内存块。当进程不需要分配内存时,它将释放内存。然后操作系统将这些块添加到其空闲列表中。当进程终止时也会发生同样的情况。进程使用的所有块都由操作系统回收
其他答案告诉你两件重要的事情:
free()
itfree()
您所处理的一切都是好的做法。我认为:
更重要的是,FREE确保了您分配的内存/缓冲区的完整性,因此存在一个很好的检查点来抑制/赶上堆损坏。在大多数现代操作系统中,所有程序资源都被释放或关闭。我能问一下是什么触发了这个问题吗?与其担心如果你不自由会发生什么,为什么不自由呢?这样你就不用担心了;valgrind发生了,大家都很高兴。问题解决了。我认为这是一个相当有效和有趣的问题:当进程退出时,O/s如何处理分配的内存(和其他资源?)?深入了解底层系统的工作方式,从虚拟内存系统分配页面。有很多东西需要学习(进程和内存管理,处理器中的虚拟内存)。尽管我知道答案,但这让我想知道“但是,它到底是如何工作的?”。你通过尝试去做你不该做的事情而学到了很多东西,而不是不去做,也不知道会有什么后果o) @MrLister我们不是故意跳过免费的。我们通常在庞大的代码库上工作,
malloc
是由一个模块完成的,free
是由另一个模块完成的,等等。这些程序运行在windows、solaris、linux、mac os等平台上。因此,我很好奇未释放的情况是如何处理的。这是有争议的:;在程序终止之前为生产构建禁用显式释放可能是一个好主意。。。
<snap>
==14209== HEAP SUMMARY:
==14209== in use at exit: 400 bytes in 1 blocks
==14209== total heap usage: 1 allocs, 0 frees, 400 bytes allocated
==14209==
<sanp>
==14209== LEAK SUMMARY:
==14209== definitely lost: 400 bytes in 1 blocks
==14209== indirectly lost: 0 bytes in 0 blocks
==14209== possibly lost: 0 bytes in 0 blocks
==14209== still reachable: 0 bytes in 0 blocks
==14209== suppressed: 0 bytes in 0 blocks
==14209==
==14209== For counts of detected and suppressed errors, rerun with: -v
==14209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)