
No.2ベストアンサー
- 回答日時:
回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。
また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。
ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。
「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。
仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。
ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。
なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)
有難うございます。
ようは通常、2G以内であればメモリを割り当てられるっということになりますね。
物理メモリが4G以上あれば設定でもう少し大きくできそうですが。
No.1
- 回答日時:
質問の意図がよく分からないのですが、ヒープ領域を広げておかないとメモリ割り当てに失敗するんでしょうか。
よっぽど特殊なコードを書かない限り、2GB弱まで自動的にメモリ割り当てが行われるはずなのですが。http://support.microsoft.com/default.aspx?scid=k …
このKBにある「デスクトップ ヒープ」のことを指しているのだとすれば、このヒープは「アプリケーションがグラフィックオブジェクトを作成するときに、グラフィックサブシステムがOSに要求するメモリ領域」であって、「アプリケーションがOSに対して要求するメモリ領域」とは違うものです。
参考:
http://www.atmarkit.co.jp/fwin2k/win2ktips/071de …
なお、ウィンドウやコントロールやGDIオブジェクトを山のように作成するアプリケーションであれば、デスクトップヒープを使い果たすという可能性もなくはありません。念のため。
この回答への補足
回答有難うございます。
特殊なコードかどうかは不明(開発者が別)です。ただしそのアプリケーションが小さいファイルを読み込んでいるときは問題を起こさないのですが。
巨大なファイルを読み込ませるとアクセス違反を起こしています。
そもそもmallocした後処理の問題があるのは十分承知しているのですが、
修正されるまでの逃げ手としてヒープの拡張を考えていました。
>「アプリケーションがOSに対して要求するメモリ領域」とは違うものです
Windowsアプリケーション内で使用するmallocはヒープ領域を使用すると
思い込んでいたのですが、違っていますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
allocってなんですか?
-
free関数で動作が止まる
-
プログラムが途中で強制終了し...
-
c言語のポインタへの文字列入力...
-
OpenCV cvLoadImageについて
-
newしないオブジェクトについて
-
配列を使わずに、変数名を動的...
-
C# DataGridView のヘッダーセ...
-
Integer変数をカラにしたいので...
-
Excelですべての組合せ(重複組...
-
ExcelVBAでのkernel32(64bit)
-
isalpha()関数について
-
Run-Time Check Failure #3とい...
-
define で 配列
-
CStringからchar*への型変換に...
-
C言語 配列の長さの上限
-
「#undef」と「#define」の使い...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語の配列のサイズ
-
C言語のポインタに直接アドレス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
c言語のポインタへの文字列入力...
-
HEAP に関すること
-
構造体でchar name[]と*nameの...
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
DLLのマルチスレッドの動作につ...
-
グローバル変数のサイズ
-
C++で、メンバもヒープに確保さ...
-
newしないオブジェクトについて
-
free関数で動作が止まる
-
構造体配列の初期化について
-
void*型のデータサイズ
-
MFCのCStringについて
-
mallocで確保するメモリの領域...
-
CreateFileMapping について
-
LPWSTRのコピー
-
c言語のメモリの確保について
-
配列の添え字の最大数とは?
-
C言語の質問です。 以下の命令...
おすすめ情報