我正在尝试内存泄漏。当我从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杀手,该杀手会在内存分配失败时选择要终止的进程。通常情况下,要杀死的进程是分配大量内存的进程,你的进程。