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 - mmap(2) 返回的地址是否有可能与堆发生冲突?

c - 为什么调用 execvp 时此 free 会失败?

C++非连续分配数组

c++ - 自定义 malloc 实现

c++ - 删除顺序、NULL 指针或内存泄漏

java - 字符串常量池内存扇区和垃圾回收

c - 使 GtkStatusbar 的文本可选择

c++ - 使用套接字发送 Iplimage

有人可以向我解释一下代码的工作原理吗?这段代码应该打印一个数字的反转

java - 同步方法的 weakValue 映射引用中的内存泄漏