
こんにちは.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で実際に何が起こってるかを確認する方法はありますか.アセンブラとか吐かせるのでしょうか?
お時間のあるときに回答してもらえたらと思います.
No.2ベストアンサー
- 回答日時:
>デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であること が保証されない。
No.4
- 回答日時:
ついでだけど, 「Macでの2GB」ってなんのことですか? 実際に「確保しようとしたサイズ」はいくつですか?
返信ありがとうございます.上のプログラムは確保するsizeをインクリメントしていき,どこでどういう動作になるか見るプログラムでした.2GBというのは,Macがエラーを吐き始めたsize=2048, つまり2048*1024*1024byteで2GBという意味でした.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Basic Net2003
-
ファイルマッピング関数で失敗
-
メモリが不足しています(VBA)
-
free()について
-
PC-98で拡張メモリを使え...
-
COMについて
-
取ってこれないメモリのはずのm...
-
直接メモリにアドレス割付けで...
-
メモリの使用量
-
論理アドレスの割り当て方法
-
DirectX9関数「D3DXCreateTextu...
-
大容量のメモリ確保をスワップ...
-
メモリの解放について VB6 VBA
-
C#、VB.NET、C++.NETでのメモリ...
-
C#のガベージコレクタについて
-
Segmentation fault
-
C/C++言語のメモリについて
-
メモリの中身(サイズ)を知る
-
gccで割当可能メモリ領域を取得...
-
【C言語】再帰が時間がかかる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報