Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

brk(2)

pagesize(2)

MALLOC(3)  —  NEWS-OS Programmer’s Manual

名称

malloc, free, realloc, calloc, alloca − メモリの割り当て

形式

char ∗malloc(size)
unsigned size;

free(ptr)
char ∗ptr;

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

char ∗calloc(nelem, elsize)
unsigned nelem, elsize;

char ∗alloca(size)
int size;

解説

malloc と free は、 汎用のメモリ割り当てパッケージを 提供します。 malloc は、 ワードの境界から始まる size バイト以上のブロックを 指すポインタを 返します。

free の引数は、 あらかじめ malloc によって割り当てられたブロックを 指すポインタです。 この空間は、 他の割り当てに利用できるようになりますが、 その内容はそのまま残されます。

すでに malloc によって割り当られた空間をそれ以上に使用した場合、 または free にいい加減な値を 渡した場合は、 異常終了します。

また、 malloc は、 サイズに応じてフリーブロックのリストを いくつか保持し、 その適当なリストから空間を 割り当てます。 適当な空き空間がないときには、 システムからもっと多くのメモリを 得るために、 sbrk(brk(2) 参照)を 呼び出します。

realloc は、 ptr で指し示されたブロックのサイズを size バイトに変更し、 そのブロック (移動された可能性があります) を 指すポインタを 返します。 その内容は、 新、 旧のサイズのうち、 短い方の位置までは変更されません。

旧バージョンと互換性を 保つため、 realloc は、 ptr が malloc、 realloc、 calloc の最後の呼び出しで確保した後、 解放されているブロックを 指している場合にも動作します。 以前は、 free、 malloc および realloc を 続けて呼び出して、 メモリの圧縮を していましたが、 現在では、 この方法はお勧めできません。

calloc は、 サイズ elsize の nelem 個の要素からなる配列に対して、 空間を 割り当てます。 この空間は、 ゼロに初期設定されます。

alloca は、 呼び出す側のスタックフレームに、 size バイトの空間を 割り当てます。 この一時作業用の空間は、 リターン時に自動的に解放されます。

それぞれの割り当てルーチンは、 どんな型のオブジェクトの記憶域としても適当なように境界調整をして、 その空間を指すポインタを返します。 空間の大きさが pagesize 以上の場合、 返される記憶域はページ境界に位置合わせされます。

関連事項

brk(2), pagesize(2)

診断

利用できるメモリがない場合、 または、 ブロックの範囲外にデータを 格納して該当領域が信頼できなくなった場合、 malloc、 realloc、 calloc は、ナルポインタ (0) を 返します。 malloc は、 すべてのトランザクションについて、 該当領域を 厳重にチェックするよう、 再コンパイルすることができます。 このような、 ソースライセンスを 持つサイトでは、 ソースコードを チェックして、 対策の方法を 調べられます。

バグ

realloc が値 0 を 返す場合、 ptr で指し示されるブロックは、 破壊されている可能性があります。 現在動いている malloc は、 システムメモリが限界に近付くときにいつも異常を 起こすわけではありません。 より大きなフリーブロックが破壊された場合、 または、 ブロックサイズの端数が切り上げられて限界を 超過する場合に、 メモリの割り当てを 失敗する可能性があります。 ブロックのサイズは2のべき乗になるよう 最適化しています。

alloca はマシンに依存しているので、 これの使用はあまりお勧めできません。

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026