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