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

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



このメールは、OSASK伝言板に書き込まれた内容です。
この書き込みに返事を書く場合は、下のURLから書き込みを行なって下さい
http://www.imasy.org/~mone/osask/index.cgi?REFER=3d12c55a_4b8c

2002/06/21 15:19
川合秀実

[OSASK 3833]へのレスです。

>> stdlib6aをベータリリースしたので、その中のstdlib.lib
>> に差し替えてお試しください。
>
>[OSASK 3805] の a.c では正しい動作をするように見えました。
>しかし、スクリプトに組み込むと以前より動作が酷くなります。

  ご報告ありがとうございます。

  その後、回避策を発見なさったようですが、僕としてはそれがこの問題の解決
になるとは思っていません。動作を追跡して、問題が起こるmalloc-freeのログ
を取れないものでしょうか?それが分かれば、たとえば、

void OsaskMain()
{
    static struct STR_MICROCODE {
        unsigned char cmd, no;
        int size;
    } microcode[] = { ...(略)... };
    struct STR_MICROCODE *pmc;
    void *ptr0[256];
    void **ptr = ptr0;

    /* 適当にtextboxをopen */

    for (pmc = microcode; pmc->cmd; pmc++) {
        if (pmc->cmd == 1) {
            ptr[pmc->no] = malloc(pmc->size);
            /* 適当にメッセージを表示。取得したptr[pmc->no]の値も表示する */
        } else {
            free(ptr[pmc->no]);
            /* 適当にメッセージを表示 */
        }
    }
    lib_waitsignal(0x0001, 0, 0);
}

のような簡単なプログラムで再現テストを繰り返してバグを追求できます。

>連続した領域があり、そこから malloc して、その後 malloc した領域を
>全て free すれば領域は元通りに連続するはずです。
>領域が連続ならば最後に free した領域に影響されないはずです。
>malloc した領域を全て free すれば同じ動作になることを期待しました。
>
>morecore して得られる領域が連続になっていないのでしょうか?
>こういった不連続があるなら分かるのですが。

  いえ、morecore()については領域は連続しています。問題は、「全て free す
れば」というところにあります。lib_init()したときの領域やwindowやtextbox
などの領域はfree()されていません。またK&Rのmallocは領域の上位アドレスか
ら割り当てていくようになっているので、下位の方に空き領域が生じます。一方
stdlib5内のmorecore()はヒープをどんどん上位に加えていくので、下位に生じ
た半端な空き領域と追加されたヒープは連続せず、メモリの分断が始まります。

  stdlib6aのmalloc()は、領域の下位アドレスから割り当てています。このため
分断は起きません。これをさらに精練してstdlib6bというものを作ろうと思って
いるのですが、そのためにもバグをつぶしたいと思っています。気が向かないと
いうことでしたらあきらめますが、ご協力いただけたらうれしいです。