[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 3857] Re: BOARD: Re: malloc/free の動作



合著です。MLで失礼します。

[Re: <3d15f0ef_114ab.mone !Atmark! imasy.org>
   written by mone !Atmark! imasy.org]

>  はい、stdlib6bではそうなっています。このNULLは失敗という意味ではありま
>せん。アクセスされないことを確信しているポインタです。free()に対してNULL
>を与えることもでき、それは何も起こりません。
>
>  K&Rでは、malloc(0)に対してNULLではないなんらかのポインタを返しメモリを
>消費します。そしてそれをfree()することで元に戻るようになっています。そっ

これはヤバイような気がします。NULL では失敗の場合と区別が付きません。
malloc はもちろん、realloc や strdup などは失敗の場合 NULL が
返ってくる筈です。エラーチェックが不可能です。
0 バイトを意図的に malloc するのは十分にあり得る話です。

こんな感じで 0 byte な時に例外処理をしないで処理できません。

ptr0 = malloc(src_len);
if (ptr0 == NULL) abort();
i = 0;
while(i < src_len) {
	*(ptr0 + i) = hogehoge(*(src+i));
	i++;
}

ptr1 = realloc(ptr0, add_len);
if (ptr1 == NULL) abort();

src_len == 0 な場合や add_len == malloc不可能 な場合や ptr0 == NULL で
realloc な場合を考える。
この様な場合、成功したのか、失敗したのかが不明になります。

>ちの方がいいのでしょうか?直すのは簡単です(0かどうかのチェックをしなけれ
>ばいいだけのことなので)。

将来的には直すべきかと思われます。

----
合著 (kattyo !Atmark! abk.nu)