(error) Common realloc mistake: ‘p’ nulled but not freed upon failureera
エラー:reallocに失敗したが古い領域は解放されていない[(error)memleakOnRealloc]
■1.新旧ポインタが同じ間違い
#include <stdlib.h>
int main(void) {
void *p = malloc(256);
if(p == NULL) {
return 1;
}
//
//~
//
p = realloc(p,1024);//よくある間違い新旧ポインタが同じ
if(p == NULL) {
return 1; //ここでメモリリーク発生
}
free(p);
}
p = realloc(p,1024);のようにrealloc()の第一引数と戻り値の変数を同じにしてはいけません。
realloc()失敗時に古い領域を指すpがNULLに上書きされるので古い領域が解放不能になります。

■2.古い領域を参照する間違い
warning: Use of memory after it is freed
警告:解放後メモリ参照
[unix.Malloc]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *oldp = malloc(100);
strcpy(oldp,"ABCDE");
printf("昔:%s\n",oldp);
char *newp = realloc(oldp,300);
if(newp != oldp){
printf("確保し直したメモリが違うアドレスだった\n");
memcpy(newp,oldp,100);//★ダメ
free(oldp); //★ダメ
}
printf("今:%s\n",newp);
free(newp);
return 0;
}
realloc成功時の
古い領域から新しい領域へのデータの引っ越しと
古い領域の解放は
realloc関数がやるのであって
プログラマが自分で書いてはダメです。
手元のLinux環境では free(): double free detected in tcache 2
とエラーを吐いて異常終了しました。
参考: