我想叮噹AddressSanitizer失敗,因爲有一個合法的泄漏。所以,我的回答會忽略:
替代方案:
- 禁用過量使用的行爲,因爲你已經想通了:這會影響到其他進程,並要求根。
- 在禁用了oom殺手的Docker鏡像中運行應用程序:該程序不影響其他進程,但需要root用戶來安裝docker(儘管這是我最喜歡的解決方案)。
- 在malloc之後寫入:可能需要很長時間才能分配大量內存,並且由於其他正在運行的進程而導致進程仍然可能被殺死,但不需要root。
- 使用ulimit -v來限制根據機器的內存量:這也不需要root,但是你的進程可能會被終止。
代碼的第三個選擇(對於Linux):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf resume_malloc;
void handle_malloc_error(int sig)
{
longjmp(resume_malloc, sig);
}
void *memalloc(size_t sz) {
void *p = 0;
int sig = setjmp(resume_malloc);
if (sig == 0) {
p = malloc(sz);
signal(SIGSEGV, &handle_malloc_error);
memset(p, 0, sz);
} else {
p = 0;
}
signal(SIGSEGV, SIG_DFL);
return p;
}
int main(int argc, char *argv[])
{
size_t sz = 160L * 1024 * 1024 * 1024L;
void *p;
for (int i=0; i < 100; i++) {
printf("size: %lu\n", sz);
p = memalloc(sz);
if (p == 0) {
printf("out of memory\n");
break;
}
sz *= 2;
}
}
如果用戶給出的值'X'作爲輸入,你知道* *多少字節,這將導致你的程序分配。你可以很容易地將'X'的值限制爲不會耗盡系統的東西。所以如果用戶輸入一個很大的值,告訴用戶它很大,然後再次詢問這個值。 –
此外,你*確實知道['malloc'](http://en.cppreference.com/w/c/memory/malloc)在分配內存失敗時返回NULL。你也可以很容易地檢查它,而不是試圖解引用空指針。 –
請提供一個最小,完整和可驗證的示例(http://stackoverflow.com/help/mcve) – stenliis