zsh 对程序内存泄漏的反应

zsh's reaction to a program leaking memory

我正在尝试内存泄漏。当我 运行 来自 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 returns NULL 之后杀死你的进程(如果无法分配新的内存)并尝试向该地址写入一个值(5)。所以基本上它是一个 NULL 指针取消引用,您的代码尝试在地址 NULL.

访问内存

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

编辑: 另一方面,它可能仍然是OS(或其程序员)的错误如果它试图将内存过度分配给您的进程。例如,在 Linux 中默认启用内存过量使用。这意味着即使 OS 没有可用内存,它也会 通过让内存分配方法成功并实际尝试在首次访问时分配内存来 进程过程。这可能会导致 malloc 成功并且 returns 非 NULL 值的情况,稍后当进程尝试访问该内存时,OS 将尝试分配它。如果 OS 失败,则它必须 block/pause 进程或终止它。 Linux 通常 运行 是它臭名昭著的 OOM 杀手,它会在内存分配失败时选择要杀死的进程。通常要杀死的进程是分配大量内存的进程,即您的进程。