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 杀手,它会在内存分配失败时选择要杀死的进程。通常要杀死的进程是分配大量内存的进程,即您的进程。
我正在尝试内存泄漏。当我 运行 来自 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 杀手,它会在内存分配失败时选择要杀死的进程。通常要杀死的进程是分配大量内存的进程,即您的进程。