本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (A~M) > m

malloc(3C)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

malloc(), free(), realloc(), calloc(), valloc(), mallopt(), mallinfo(), memorymap(), alloca() ― メインメモリー割り当て

構文

#include <stdlib.h>

void *malloc(size_t size);

void *calloc(size_t nelem, size_t elsize);

void *realloc(void *ptr, size_t size);

void *valloc(size_t size);

void free(void *ptr);

void memorymap(int show_stats); (廃止)

alloca

#include <alloca.h>

void *alloca(size_t size);

SYSTEM V 構文

#include <malloc.h>

char *malloc(unsigned size);

void free(char *ptr);

char *realloc(char *ptr, unsigned size);

char *calloc(unsigned nelem, unsigned elsize);

int mallopt(int cmd, int value);

struct mallinfo mallinfo(void);

特記事項

古い malloc(3X) パッケージの機能は malloc(3C) に統合されました。 ライブラリ -lmalloc リンカーオプションに対応する (/usr/lib/libmalloc.a) ライブラリには何も含まれていません。 このライブラリを参照する makefile は、そのまま実行できます。

廃止インタフェース

memorymap() は HP-UX 11i バージョン 1 で非推奨となり、現時点では廃止されました。

説明

このマニュアルで説明されるのは、簡単で汎用のメモリーアロケーション パッケージです。

malloc()  

最小の size バイトのメモリーブロックを確保します。 確保したスペースの初期化は行いません。

calloc()  

nelem エレメントで、それぞれ elsize バイトの大きさを持つ配列のスペースを確保します。確保したスペースは 0 に初期化されます。 実際には、少なくとも nelem * elsize バイトのスペースが確保されます。

realloc()  

ptr で指定された、ブロックの大きさを size バイトに変更し、(移動させられた) ブロックへのポインターを返します。 古いサイズおよび新しいサイズより小さい部分の内容は、変更されないまま残ります。 ptr に NULL ポインターが指定された場合、 realloc() は、指定した大きさを確保する malloc() と同様な動作をします。 size が 0 に指定され、 ptr が NULL ポインターでない場合は、指定されたオブジェクトが解放され NULL が返されます。 特殊な整列形式をもつブロックの realloc()(valloc() によって作成されたものなど) はサポートされていません。

valloc()  

sysconf __SC_PAGESIZE) から返される値の倍数に調整された境界から、少なくとも size バイトのメモリーブロックを確保します。 確保したスペースの初期化は行いません。

free()  

ptr (malloc()realloc()calloc()valloc() で割り当てられた ブロックへのポインター) で指定されたスペースを解放し、以後の割り当てで使用可能にします。 ptr が、 NULL ポインターの場合は、何も行いません。

mallopt()  

割り当てアルゴリズムなどの malloc(3C) パッケージのオプションを制御します。 cmd に使用可能な値は、以下のとおりです。

M_MXFAST  

maxfastvalue に設定します。 このアルゴリズムは、ラージグループ内の、 maxfast 以下の大きさのブロックをすべて割り当て、非常に高速にそれらを掃き出します。 maxfast のデフォルト値は 0 です。

M_NLBLKS  

numlblksvalue にセットします。これまでに説明した「ラージグループ」には、それぞれ numlblks ブロックが含まれます。 numlblks は 1 よりも大きくなければなりません。 numlblks の デフォルト値は 100 です。

M_GRAIN  

grainvalue にセットします。 maxfast よりも小さいすべてのブロックのサイズは、最も近い grain の倍数にまで繰り上げられます。 grain は 0 よりも大きくなければなりません。 grain のデフォルト値は、任意のデータタイプを境界付けできるのに十分な最小の数です。 grain がセットされていると、 value は、デフォルトの倍数まで繰り上げられます。

M_BLOCK  

malloc()realloc()calloc() および free() において、 ブロック可能なすべてのシグナルをブロックします。 このオプションは、メモリーを割り当てるシグナル処理関数を作るために用意されています。 このオプションが設定されると、 malloc(3C) ルーチンは、シグナル処理関数から呼び出すことができるようになります。 デフォルトの動作は、 ブロック可能なシグナルのブロックを行いません。

注記: M_BLOCK オプションを設定すると、 malloc() の性能は著しく影響を受けます。

M_UBLOCK  

malloc()realloc()calloc() および free() でブロック可能なシグナルのブロックを行いません。 このオプションは、 M_BLOCK オプションで初期化されたシグナルブロックをキャンセルします。

M_REL_LAST_FBLK  

最終空きブロックをヒープに解放 機能を使用可能にします。 このオプションは、1 つのメモリー領域を持つ 32 ビットアプリケーション用に提供されています。 空きブロックのサイズがしきい値より大きい場合のみ、最終ブロックの解放が行われます。

しきい値は、 2 * (メモリー拡張係数) * 4096 バイトとして定義されます。 この機能は、 M_MXFAST の値がしきい値以上の場合に使用不可となります。 デフォルトでは、この機能は使用不可です。

以上の値は、 <malloc.h> ヘッダーファイル で定義されています。

mallopt() は繰り返し呼び出すことができます。ただし、最初のスモールブロックが割り当てられた後で、 M_MAXFASTM_NLBLKS および M_GRAIN の値を変更することはできません。

mallinfo()  

スペースの使用状況を取得しますが、最初のスモールブロックが割り当てられるまでは呼び出せません。 これは、構造体 mallinfo を返します。

arena : アリーナ内の総スペース 
fsmblks : 空きスモールブロックのバイト数 
fordblks : 空き標準ブロックのバイト数 
hblks : 保持ブロック数 
hblkhd : 保持ブロックのヘッダーのバイト数 
keepcost : keep オプションを使用可能にするコスト 
ordblks : 標準ブロックの数 
smblks : スモールブロックの数 
uordblks : 使用中の標準ブロックのバイト数 
usmblks : 使用中のスモールブロックのバイト数 

mallinfo 構造体は、 <malloc.h> ヘッダーファイル内で定義されます。

それぞれの割り当てルーチンは、(適当なポインター強制の後) 任意のタイプのオブジェクトの記憶領域として適切にスペースを境界付けするためのポインターを返します。

memorymap()  

HP-UX 32 ビット オペレーティングシステムでのみ、メモリー割り当ての内容を表示します。 アドレスおよびブロックのリストは (printf() を使用して) 標準出力に書き出されます。 show_stats パラメータが 1 の場合、 ブロックの数およびサイズに関連する統計情報も出力されます。 値が 0 の場合は、メモリーマップのみが書き出されます。

memorymap() により表示されるアドレスおよびサイズは、アプリケーションによる要求に適合しない場合もあります。 ブロックのサイズ (割り当て関数から見た場合) は、ヘッダー情報およびブロックの境界付けを適切に行うためのパディングを含みます。 アドレスもヘッダー情報を適切にするため、ある程度オフセットされます。

memorymap() は、HP-UX 11i バージョン 1 で非推奨となり、現時点では廃止されました。

alloca()  

最小でも size バイトのメモリーブロックを呼び出し側のスタックから確保します。 確保したスペースの初期化は行いません。 このスペースは、呼び出しルーチンが終了すると自動的に解放されます。

alloca() で確保されるメモリーと、他のメモリー割り当て関数で確保されるメモリーとの関連性はありません。 alloca() で返されたアドレスを、他のメモリー関数に対する引き数として使用したときの動作は定義されていません。

このルーチンの実現方法はシステムに依存しているので、使用は推奨できません。

戻り値

正常終了すると、 malloc()realloc()calloc() および valloc() は、(適当なポインター強制の後) 任意のタイプのオブジェクトの記憶領域として適切にスペースを境界付けするためのポインターを返します。 失敗した場合は NULL ポインターを返します。 realloc() が NULL ポインターを返した場合、元のポインターが指定していたメモリーはそのまま残っています。

mallopt() は正常終了すると 0 を返し、失敗すると 0 以外の値を返します。

診断

malloc()realloc()calloc() および、 valloc() は、使用可能メモリーがないか、 malloc() が管理しているメモリーの内容の破壊が発見された場合、 NULL ポインターを返します。 ブロックの境界を超えてデータが保存された場合や、(malloc()realloc()calloc() および valloc() が生成したものでない) 無効なポインターが引き数として free()realloc() に渡された場合は、メモリーの内容は破壊されます。

mallopt() が、スモールブロックの割り当ての後に呼び出され、 cmdM_BLOCKM_UBLOCK 設定されてないか、 cmd もしくは value が無効の場合、0 でない値が返されます。 それ以外の場合、0 が返されます。

エラー

[ENOMEM] 

malloc()realloc()calloc() および valloc() は、メモリーが足りなくなった場合、 errno を ENOMEM にセットし、NULL ポインターを返します。

[EINVAL] 

malloc()realloc()calloc() および valloc() は、 malloc() が管理しているメモリーの内容の破壊が発見されると、 errno を EINVAL にセットし、NULL ポインターを返します。

外部環境の影響

malloc() ファミリーの性能は、2 つの環境変数 _M_ARENA_OPTS_M_SBA_OPTS および 3 つの新しいグローバル変数 __hp_malloc_maxfast__hp_malloc_num_smallblocks__hp_malloc_grain で調整できます。

スレッド化アプリケーションの場合、 malloc() は複数のアリーナを使用します。 異なるスレッドからのメモリー要求は、異なるアリーナで処理されます。 _M_ARENA_OPTS を使用すると、アリーナの数や、アリーナを何ページ (ページサイズは 4096 バイト) ずつ拡張するか (拡張係数) を調整できます。 一般的には、性能を良くするために、アプリケーション内のスレッドが多いほどアリーナをたくさん使用する必要があります。 スレッド化アプリケーションのアリーナ数は、1〜64 です。 非スレッド化アプリケーションの場合は、使用されるアリーナは 1 つだけです。 環境変数が設定されていないか、アリーナ数に範囲外の値が設定されている場合は、デフォルト値の 8 が使用されます。 拡張係数は 1〜4096 で、デフォルト値は 32 です。 この係数が範囲外の場合も、デフォルト値が使用されます。

次に _M_ARENA_OPTS の使用方法の例を示します。

$ export _M_ARENA_OPTS = 16:8

この例では、アリーナ数が 16 で、拡張サイズは 8×4096 バイトです。 一般的に、アリーナ数が多いほど拡張係数を小さくし、アリーナ数が少ないほど拡張係数を大きくする必要があります。

_M_SBA_OPTS はスモールブロック アロケータをオンにするために使用し、 maxfastgrain、 および numlblks という、スモールブロック アロケータ用のパラメータをセットアップします。 スモールブロック アロケータがオンのアプリケーションは、オフのアプリケーションよりも一般的に速く動作します。 スモールブロック アロケータは、 mallopt() でオンにできます。 ただしこの方法は、C++ や Java のアプリケーションでは遅すぎます。 環境変数を使用すると、アプリケーションの開始前にアロケータをオンにできます。 環境変数を使用しても、 mallopt() 呼び出しを同様に使用できます。 環境変数が設定されていて、スモールブロック アロケータが使用されていない場合は、 _M_SBA_OPTS に設定されている値にかかわらず、 以降の mallopt() 呼び出しで変更できます。 環境変数が設定されていて、スモールブロック アロケータがすでに使用されている場合は、 mallopt() を呼び出しても効果はありません。

この環境変数を使用するには、次のようにします。

$ export _M_SBA_OPTS = 512:100:16

この場合、 maxfast サイズが 512、スモールブロック数が 100、最低サイズが 16 です。 3 つの値すべてを、この順で指定する必要があります。 正しく指定しないと、デフォルト値が代わりに使用されます。

非スレッド化アプリケーションでは、 _M_SBA_OPTS は効果がありますが、 _M_ARENA_OPTS は効果がありません。

3 つの新しいグローバル変数 __hp_malloc_maxfast__hp_malloc_num_smallblocks および __hp_malloc_grain は、 _M_SBA_OPTS 環境変数の設定値より優先される値を指定するために導入されました。 アプリケーション内でこの 3 つの変数を初期化すると、 _M_SBA_OPTS は無効になります。 この方法によって、最適な状態に調整したアプリケーションが、さまざまなユーザー環境で同じ性能を発揮するようにすることができます。 ただし、 _M_ARENA_OPTS と同様に、メモリーブロックが割り当てられる前に mallopt() を呼び出すことによって、 malloc() の動作が変わります。 デフォルトでは、これらの 3 つの変数は、開始時に 0 に初期化されます。 これは、次のように変数を設定したのと同じになります。

extern int __hp_malloc_maxfast=512;
extern int __hp_malloc_num_smallblocks=100;
extern int __hp_malloc_grain=16;

デフォルトでは、SBA (スモールブロックアロケーション) はオンです。 これにより、アプリケーション性能向上の効果があることがあります。 SBA をオフにするには、次のように設定します。

extern int __hp_malloc_maxfast=-1;

他のすべての設定値については、 mallopt() を参照してください。

注記: これらの変数を変更すると、バッファーオーバーランなどのユーザーメモリーの欠陥が顕在化する可能性が高くなります。

警告

malloc() 関数は、 プロセスのアドレス空間を増やすため brk() および sbrk() (brk(2) 参照) を使用します。 そのため、 brk() または sbrk() を使用するアプリケーションプログラムは、それらをアドレス空間を減らすために使用してはなりません。 使用すると malloc() の機能を混乱させることになります。

free() および realloc() は、ポインター引き数およびその有効性をチェックしません。

以下のアクションは不適切なプログラミング手法と見なされているため、実行しないようにしてください。その結果は予測不能であり、望ましくない可能性があるため、サポートされません。望ましくない結果の例として、データの損失、メモリー障害、バスエラー、無限ループなどがあります。

  • malloc()realloc()calloc() および valloc() の呼び出しにより得られたものでないポインターを使用して、 free() または realloc() を呼び出すこと

  • 割り当てられたブロックの境界外からデータを読み取ったり、境界外へデータを書き込むこと

  • 整列済みブロック (valloc() の結果など) に対して realloc() を実行しようとすること

特に以下のアクションは実行しないようにしてください。これらは、 malloc() の将来のバージョンではサポートされない可能性があります。

  • 同一のブロックに対して free() を 2 回行うこと

  • 解放されたブロックの更新されていない内容を使用すること

  • ブロックを解放した後で、そのブロックに対して realloc() を実行しようとすること

ドキュメントに示されてない、以前のメモリー割り当て関数の機能は実現されていません。 アプリケーションに上記の不適切なプログラミング手法、または推奨されない手法のいずれかが使用されている場合、将来のリリースで引き続き動作可能である保証はありません。

廃止インタフェース

memorymap() は HP-UX 11i バージョン 1 で非推奨となり、現時点で廃止されました。 malloc の統計情報を参照するには、 mallinfo() 関数のほうが効果的です。

互換性

旧版の malloc(3X) と新版 の malloc(3C) の外部からわかる違いは、旧版は 0 バイトの要求に対して NULL ポインターを返す場合があるということです。 malloc(3C) は、有効なメモリーアドレス返します。 多くのアプリケーションでは、この差異による影響はないでしょう。

SBA (スモールブロックアロケーション) のデフォルトの状態は、Itanium(R) ベース システムではオンで、 PA-RISC システムではオフです。 性能を考慮して、このようになっています。詳細はこのマンページの「外部環境の影響」の項を参照してください。

参照

brk(2), errno(2), thread_safety(5)

標準準拠

malloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

calloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

free(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

mallinfo(): SVID2, XPG2

mallopt(): SVID2, SVID3, XPG2

realloc(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.