プロが教える店舗&オフィスのセキュリティ対策術

こんにちは.mallocの動作,及びコンパイルの仕様について質問です.
以下のような.cのプログラムを書いてgccでコンパイルして実行してみました.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int size = 0;
int *tmp = NULL;
while(1){
printf("Size %d\n", size++);
tmp = (int *)malloc(size * 1024 * 1024);
usleep(10000);
free(tmp);
}
}

このプログラムだと,heapから取ってこれないぐらい大きいメモリだとなんか起きるのかな?どれぐらいまで取ってこれるのかな?という興味でやってみたのですが,

1)32bit, 64bit ubuntu のgcc (バージョンは覚えてないですけど一番updateされてると思います)では永遠に回り続け,

2)Mac のgccだとSize=2048以降,つまり2GB以降で
a.out(1145,0x7fff73a1b310) malloc: ***mach_vm_map(size=18446744071562067968) failed (error code=3)
*** error: can't allocate region
というエラーをはきます.(プログラムは回り続けます)

a. この違いはgccの違いからくるという理解でよろしいですか?Macでの2GBというのもコンパイル側の制約なのでしょうか?
b. ubuntuでは実際何が起こってるのでしょう?1000GBとか絶対取れないですけど回ってますし.
c. ubuntuで実際に何が起こってるかを確認する方法はありますか.アセンブラとか吐かせるのでしょうか?

お時間のあるときに回答してもらえたらと思います.

A 回答 (4件)

http://linuxjm.sourceforge.jp/html/LDP_man-pages …
>デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であること が保証されない。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.大変参考になるリッファレンスをありがとうございます.

お礼日時:2014/02/20 16:49

ついでだけど, 「Macでの2GB」ってなんのことですか? 実際に「確保しようとしたサイズ」はいくつですか?

    • good
    • 0
この回答へのお礼

返信ありがとうございます.上のプログラムは確保するsizeをインクリメントしていき,どこでどういう動作になるか見るプログラムでした.2GBというのは,Macがエラーを吐き始めたsize=2048, つまり2048*1024*1024byteで2GBという意味でした.

お礼日時:2014/02/20 16:47

tmp が NULL でないことを検証せにゃイカンのとちゃいます?


mallocはメモリが確保できんかったらNULL返すんしょ?
    • good
    • 0
この回答へのお礼

回答ありがとうございます.チェックしてみたところ僕の環境だとMac, Ubuntuともに2048MB=2GB確保しようとしたところでNULLが返ってくるようですね.

お礼日時:2014/02/20 16:44

エラーが出るかどうかは OS の違いだと思う.



で, malloc でメモリが取れなかったときどうなるか, 仕様をちゃんと確認してください.
    • good
    • 0
この回答へのお礼

返信ありがとうございます.OSの違いのようですね.もう少し勉強してみます.

お礼日時:2014/02/20 16:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!