ZSH 对程序泄漏内存的反应



我正在尝试内存泄漏。当我从zsh运行以下程序时,它会启动并在一段时间后终止。zsh在做吗?谁决定什么时候杀了它?

#include <iostream>
#include <stdlib.h>
int main() {
  int *a = (int *) malloc(sizeof(int));
  *a = 5;
  std::cout << *a << std::endl;
  for(int i = 0; i < 10000000000000000; ++i) {
    int *c = (int *) malloc(1024); // 1kb per iteration
    *c = 5;
    std::cout << *c << std::endl;
  }
}

这取决于您如何运行它,但通常是操作系统在malloc返回NULL(如果无法分配新内存)并尝试向该地址写入值(5)后杀死您的进程。因此,基本上它是一个NULL指针解引用,您的代码试图访问地址为NULL的内存。

从哲学上讲,是程序员决定编写错误代码并使程序崩溃。:-)

编辑:另一方面,如果操作系统(或其程序员)试图向进程过度投入内存,则可能仍然是操作系统的错误。例如,默认情况下,Linux中会启用内存过度使用。这意味着,即使操作系统没有可用的内存,它也会让内存分配方法成功,并在进程首次访问时尝试分配内存,从而对进程负责。这可能导致malloc成功并返回非NULL值的情况,稍后当进程试图访问该内存时,操作系统将尝试分配该内存。如果操作系统失败,则必须阻止/暂停该进程或终止该进程。Linux通常运行其臭名昭著的OOM杀手,该杀手会在内存分配失败时选择要终止的进程。通常情况下,要杀死的进程是分配大量内存的进程,你的进程。

最新更新