ライブラリレベルの動的メモリー割り当ては、動的メモリー割り当てに使いやすいインタフェースを提供します。
malloc(3C)
free(3C)
calloc(3C)
cfree(3MALLOC)
malloc は、最低でも要求されたメモリー量のメモリーブロックへのポインタを返します。この (メモリー) ブロックは、任意のタイプのデータを格納できるように境界整列されます。
free は、malloc、calloc、realloc、memalign、または valloc で取得したメモリーをシステムメモリーに返します。動的メモリー割り当てインタフェースによる予約をしてないブロックを解放しようとするとエラーが発生し、プロセスがクラッシュする可能性があります。
calloc は、0 で初期化されたメモリーブロックへのポインタを返します。calloc で予約されたメモリーをシステムに返すには、cfree、free いずれでも可能です。このメモリー (ブロック) は、指定されたサイズの要素数からなる配列を格納できるように割り当ておよび境界整列されます。
realloc は、プロセスに割り当てられているメモリーブロックのサイズを変更します。realloc は、割り当てられているメモリーブロックのサイズを増減するのに使用できます。realloc は、問題を起こさずにメモリー割り当てを減らすことができる唯一の方法です。再割り当てされたメモリーブロックの位置は変更される可能性がありますが、その内容はメモリー割り当てのサイズが変更されるまで変更されません。
Sun™ WorkShop ツールパッケージを使用すると、動的メモリーの使用中に発生するエラーを発見して除外することができます。Sun WorkShop の Run Time Checking (RTC) 機能は、動的メモリーの使用中に発生するエラーを発見します。
-g オプションを付けてプログラムをコンパイルしなくても、RTC はすべてのエラーを発見できます。しかし、 特に初期化されていないメモリーから読み取る場合、エラーの正確性を保証するために、(-g で入手できる) シンボリック情報が必要になることもあります。したがって、シンボリック情報が入手できないと、ある種のエラーは抑制されます。このようなエラーには、a.out の ruiや共有ライブラリの rui + aib + air があります。この動作を変更するには、suppress と unsuppress を使用します。
-access オプションは、アクセス権のチェックをオンにします。RTC は次のようなエラーを報告します。
不正な解放
重複する解放
整列されていない解放
整列されていない読み取り
整列されていない書き込み
メモリー不足
割り当てられていないメモリーからの読み取り
初期化されていないメモリーからの読み取り
読み取り専用メモリーへの書き込み
割り当てられていないメモリーへの書き込み
デフォルトの動作は、アクセス権エラーを発見するたびにプロセスを停止します。この動作を変更するには、rtc_auto_continue dbxenv 変数を使用します。on に設定した場合、RTC はアクセス権エラーをファイルに記録します。このファイル名は rtc_error_log_file_name dbxenv 変数で決定されます。デフォルトでは、一意なアクセス権エラーごとにエラーが発生した最初の時刻だけが報告されますが 、rtc_auto_suppress dbxenv 変数を使用して変更できます。この変数のデフォルト設定は on です。
-leaks オプションは、リークのチェックをオンにします。RTC は次のようなエラーを報告します。
メモリーリークの可能性 – 唯一のポインタがブロックの真ん中を指しています。
メモリーリークの可能性 – ブロックへのポインタがレジスタだけに存在します。
メモリーリーク – ブロックへのポインタが存在しません。
リークのチェックをオンにした場合、プログラムが終了したとき、リークレポートが自動的に報告されます。このとき、潜在的なリークを含むすべてのリークが報告されます。デフォルトでは、簡易レポートが生成されます。このデフォルトは dbxenv rtc_mel_at_exit を使用すると変更できます。リークレポートはいつでも要求できます。
-frames n 変数を使用した場合、リークが報告されるとき、n 個までのスタックフレームが個別に表示されます。-match m 変数を使用した場合、リークは結合されて表示されます。複数のリークが発生した割り当て時に、呼び出しスタックが m 個のフレームに一致した場合、これらのリークは結合されて、単一のリークレポートとして報告されます。n のデフォルト値は 8 または m の大きい方ですが、16 が上限です。 m のデフォルト値は 2 です。
-memuse オプションはメモリー (ブロック) 使用状況のチェック (memuse) をオンにします。check -memuse を使用すると、check -leaks も自動的に使用されます。つまり、プログラムが終了したとき、リークレポートに加えて、(メモリー) ブロック使用状況レポート (biu) が報告されます。デフォルトでは、簡易 (メモリー) ブロック使用状況レポートが生成されます。このデフォルトは dbxenv rtc_biu_at_exit を使用すると変更できます。プログラムの実行中はいつでも、プログラム内のメモリーがどこに割り当てられているかを参照できます。
次の節では、-frames n と -match m 変数の機能について説明します。
check -access; check -memuse [-frames n] [-match m] と同じです。 rtc_biu_at_exit dbxenv 変数の値は check -all では変更されません。 そのため、デフォルトでは、プログラムが終了したとき、メモリー (ブロック) 使用状況レポートは作成されません。
check -all; suppress all; unsuppress all in funcs files loadobjects と同じです。このオプションを使用すると、気になる場所に RTC を集中させることができます。
この節では、その他のメモリー制御インタフェースについて説明します。
sysconf(3C) は、メモリーページのシステム依存サイズを返します。移植性のため、アプリケーションはページのサイズを指定する定数を埋め込まないでください。同じ命令セットの実装においても、ページのサイズが異なることは特に珍しいことではありません。
mprotect(2) は、指定されたアドレス範囲内にあるすべてのページに、指定された保護を割り当てます。保護は、配下のオブジェクトに許可されたアクセス権を超えることはできません。
break は、スタック内には存在しないプロセスイメージにおいて最大の有効なデータアドレスです。プログラムが実行を開始するとき、ブレーク値は通常、execve(2) によって、プログラムとそのデータ記憶領域によって定義される最大のアドレスに設定されます。
brk(2) を使用すると、さらに大きなアドレスにブレークを設定できます。また、sbrk(2) を使用すると、プロセスのデータセグメントに記憶領域の増分を追加できます。getrlimit(2) の呼び出しを使用すると、データセグメントの可能な最大サイズを取得できます。
caddr_t brk(caddr_t addr); caddr_t sbrk(intptr_t incr);
brk は、呼び出し元プログラムが使用していないデータセグメントの最低の位置を addr に設定します。この位置は、システムページサイズの次の倍数に切り上げられます。
sbrk (代替のインタフェース) は、呼び出し元プログラムのデータ空間に incr バイトを追加して、新しいデータ領域の開始場所へのポインタを返します。