文書番号: 402041
最終更新日: 2004/04/27
この資料は以下の製品について記述したものです。
- Microsoft(R) QuickC(R) Compiler for MS-DOS(R) Version 2.0
- Microsoft(R) C Professional Development System Version 6.0
- Microsoft(R) C/C++ Development System for MS-DOS(R) and Windows(R)Version 7.0A (以下 C/C++ 7.0A)
- Microsoft(R) Visual C++(TM) Development System Professional Edition forWindows(R) Version 1.0
- Microsoft(R) Visual C++(TM) Development System for Windows(R) Version 1.5(以下 Visual C++ 1.5)
概要
の資料は、MS-DOS 上のプログラムで malloc 系関数で割り当てたメモリブロックを
free 系関数で割り当てを解除しても、メモリブロックが開放されない理由について
説明したものです。
詳細
malloc 系関数は 8K byte 単位でヒープ領域からメモリの取得を行い、この 8K byte の
中から指定したサイズのメモリブロックを割り当てます。指定したサイズが 8K byte
を超える場合、再度 8K byte のメモリをヒープ領域から取得し、合計 16K byte の
中から指定されたサイズのメモリブロックの割り当てを行います。
malloc 系関数で一度ヒープ領域から 8K byte 単位で取得されたメモリは、free 系関数
で解除してもシステムのヒープ領域に開放されません。プログラムが終了するまで取
得されたままです。
これはプログラムの動作が、他のシステムの影響を受けないようにするためです。
malloc 系関数で取得されたメモリブロックを free 系関数で解除し、再度、同じサイズ
のメモリブロックを malloc 系関数で取得する場合は、一回目で取得に成功している
ので、二回目以降の取得に失敗する可能性は低くなります。
これに対し、_halloc 関数 _hfree 関数( _dos_allocmem 関数 _dos_freemem 関数)は
メモリブロックの取得や解除が自由にできますが、一回目のメモリブロックの取得と
解除が成功していても、二回目以降も同様に成功するとは限りません。必ず、割り
当てに失敗したときの処理を考慮する必要があります。
free 系関数で解除してもメモリがシステムに開放されないことが原因で、子プロセス
を複数回実行するようなアプリケーションにおいて、一度実行できた子プロセスが、
二回目以降メモリ不足で実行できないことがあります。このような場合 _heapmin
系関数によりシステムに未使用のメモリを開放する事で回避できます。
※_heapmin 系関数は QuickC には用意されていません。
Keywords: KBINFO KB402041
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbQC200 kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8