realloc

致命的な事に気付いていなかった。
これ、PGやって10年間も気付いていなかった。

long test()
{
    void *ptr = malloc(1024);
    if(ptr == NULL)
        goto error_label_0;

    ptr = realloc(ptr,1024*1024);
    if(ptr == NULL)
        goto error_label_0;

    free(ptr);
    return 0;

error_label_0:
    return -1;
}

このソースメモリリースする可能性がある。
やべぇ。
これは恥ずかしい。
リークしないコードは、こんなかな?

long test()
{
    void *ptr,
         *temp;

    ptr  = malloc(1024);
    if(ptr == NULL)
        goto error_label_0;

    temp = realloc(ptr,1024*1024);
    if(temp == NULL)
        goto error_label_0;
    ptr  = temp;

    free(ptr);
    return 0;

error_label_0:
    if(ptr != NULL)
        free(ptr);
    return -1;
}


realloc で失敗した場合、上の場合だと元のアドレスがリークする。
書き慣れた感じでは無い(今まで書いたこと無いからw)ので、多分もう少し良い書き方があるかも。
まぁ、そんなことはどうでも良くて。


イレギュラーパターンだから、そんなに多くの場合で問題が出る訳では無い。・・・が、最近だと10M程度はメモリ確保しちゃったりする場合もあるからなぁ。
特にサーバ系はやう゛ぁいかも。
不覚だ。


言い訳をすると、どっかで拾ったサンプルがこうなっていたからなんだと思うんだ。





・・・o...rz