char *a = (char*)malloc(4);
memcpy(a, "123", 3);
char *b = a;
char *c = a;
if (b) free(b);
if (c) free(c); // ❌ Double Free
a、b、c 指向**同一塊堆疊記憶體**。free(b) 釋放該記憶體,並將該區塊標記為可用。free(c) 嘗試釋放**已釋放**的記憶體 → **Double Free**,導致未定義行為(通常崩潰或堆疊損毀)。if (c) 判斷無效:free() **不會將指標設為 NULL**,c 仍保有舊位址(野指標),條件為真。free(a); // 或 free(b) 或 free(c),三選一
a = b = c = NULL; // 良好習慣:釋放後置 NULL
shared_ptr),C 需手動實作。void safe_free(void **ptr) {
if (ptr && *ptr) {
free(*ptr);
*ptr = NULL;
}
}
// 使用
safe_free((void**)&a); // a 釋放並設為 NULL
safe_free((void**)&b); // b 已為 NULL,不會重複釋放
malloc/free 必須一一對應,同一記憶體區塊只能 free 一次。 釋放後立即將指標設為 NULL,避免野指標誤用。