malloc その後

2GB 以上だめなのって、32bit 符号付きな値でサイズ指定してるからそれ以上は一気にとれないだけじゃね?しかもさっきのプログラム、free() してないじゃん、ということに気づいたので、やってみた。
FreeBSD はまあ、loader.conf で設定してるから妥当。

% ./a.out
malloc   128MB :OK!
malloc   256MB :OK!
malloc   384MB :OK!
malloc   512MB :OK!
malloc   640MB :OK!
malloc   768MB :OK!
malloc   896MB :OK!
malloc  1024MB :OK!
malloc  1152MB :OK!
malloc  1280MB :OK!
malloc  1408MB :OK!
malloc  1536MB :OK!
malloc  1664MB :OK!
malloc  1792MB :OK!
malloc  1920MB :OK!
malloc  2048MB :failed...

MacOS X は 32bit 環境でもけっこういける。64bit 環境なら無限だ。

% ./a.out
malloc   128MB :OK!
malloc   256MB :OK!
malloc   384MB :OK!
malloc   512MB :OK!
malloc   640MB :OK!
malloc   768MB :OK!
malloc   896MB :OK!
malloc  1024MB :OK!
malloc  1152MB :OK!
malloc  1280MB :OK!
malloc  1408MB :OK!
malloc  1536MB :OK!
malloc  1664MB :OK!
malloc  1792MB :OK!
malloc  1920MB :OK!
malloc  2048MB :OK!
malloc  2176MB :OK!
malloc  2304MB :OK!
malloc  2432MB :OK!
malloc  2560MB :OK!
malloc  2688MB :OK!
malloc  2816MB :OK!
malloc  2944MB :OK!
malloc  3072MB :OK!
malloc  3200MB :OK!
a.out(2293) malloc: *** vm_allocate(size=134217728) failed (error code=3)
a.out(2293) malloc: *** error: can't allocate region
a.out(2293) malloc: *** set a breakpoint in szone_error to debug
malloc  3328MB :failed...

テストプログラムはこんな感じ。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define UNIT 128
#define LIMIT 10240/UNIT // 10240/UNIT = max 10GB
void hogealloc(int level){
void *p;
int l;
l = level + 1;
printf("malloc %5dMB :", l*UNIT);
if ( (p = malloc(UNIT*1024*1024)) == NULL ){
printf("failed...\n");
return;
} else {
printf("OK!\n");
if( l == LIMIT ) printf("exit.\n");
else hogealloc(l);
return;
}
}
main(){
int s=1;
hogealloc(0);
}

free() してないけど、まあ、これならいいだろ。

コメントを残す