【发布时间】:2013-05-16 11:28:15
【问题描述】:
正如我在here 中描述的那样,我正在编写一个需要大量内存用于缓存目的的应用程序。现在我正在玩一些 malloc / new 结构来弄清楚我如何实现它。我做了一个奇怪的观察:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while(1) {
char *foo = (char*)malloc(1024);// new char[1024];
if(foo == NULL) {
printf("Couldn't alloc\n");
fflush(stdout);
return 0;
}
}
return 0;
}
为什么永远无法到达 printf?如果我的系统内存不足,则据说 malloc 返回 NULL,正如 here 所解释的那样。但我总是收到 SIGKILL(我正在使用 linux...)。
【问题讨论】:
-
@slugonamission: Overcommit/OOM 杀手也是我的第一个想法,但 OP 不 取消引用指针,因此实际上没有理由崩溃(或 SIGKILL)。
-
@Damon 但是你确定堆实现没有试图访问内核返回的内存吗?
-
请不要转换 malloc 的结果
-
malloc 的强制转换往往会掩盖代码中的其他问题。由于保证返回与请求的数据类型正确对齐,因此这种屏蔽是不可取的。
-
在一个更幽默的注释中,有一个OOM杀手here的类比...
标签: c++ c memory-management