c - 是否有任何代码片段演示内存泄漏或忘记释放内存分配的危害

标签 c memory memory-management memory-leaks

我总是被告知最后需要释放之前分配的内存。但由于很多次我忘记释放内存,程序没有显示任何差异。我想知道是否有任何代码片段可以演示之前分配的foget free内存的危害。如果我忘记释放它们,这些似乎没问题。

...
int i;
char *buff[64];
for( i = 0; i < 64; i++ ) {
    buff[i] = malloc(1024*100);
    strcpy( buff[i], "Some String");
    puts(buff[i]);
}
...

最佳答案

好的,我来解释一下这个问题。

  • 计算机的内存是有限的(现代个人计算机大约有 8 GB)。 操作系统和应用程序需要内存,以便它们的代码可以加载到内存中并由 CPU 执行。
  • 现代系统将内存分成大小相等的 block (称为页面),实际页面大小因系统而异
  • 因此,计算机的页面大小(内存块)是有限的。如果正在运行的进程需要的页面数量超过限制,会发生什么?

    • 操作系统只是从内存中取出几页并将其保存到硬盘上,这称为交换
    • 稍后进程可能需要一个已换出的页面,因此操作系统会将其换入,因为硬盘速度慢得多,这会严重影响性能

    • 如果存在大量交换操作,这称为抖动。

最重要的是,如果有一个进程泄漏了内存。系统将继续抖动,进程将在很长的队列中等待硬盘设备。

我还鼓励您学习计算机架构和操作系统,以获得深入的见解。

关于c - 是否有任何代码片段演示内存泄漏或忘记释放内存分配的危害,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683431/

相关文章:

c - 多线程段错误

javascript - 从 JavaScript 中的局部变量释放内存

cordova - Firebase:在使用 .once() 检索所有子节点后监听它们的变化?

c - 数组和C语言中的指针到底有什么区别?

c - 在 C 程序中查找堆损坏

c - C中的bss段

c - 使用 sprintf 构建字符串时出现的问题

c - 为什么指针地址递增指向下一个 block

java - 将控制权从应用程序转移到 java 框架

c - 将指针从指针数组复制到另一个变量的直接赋值是否有效?