void testFree(char *par) {
void*free(par); // 語法錯誤:void* 是類型聲明,非調用
par = NULL; // 只修改副本,原指針不變
}
int main() {
char *str = malloc(100);
testFree(str);
printf("%s", str); // 未崩潰但屬未定義行為:訪問已釋放內存 (野指針)
}
void safeFree(void **ptr) {
if (ptr && *ptr) {
free(*ptr);
*ptr = NULL; // 修改原指針值
}
}
// 調用
safeFree((void**)&str); // 需強轉,因 void** 不能隱式轉換 char**
#define SAFE_FREE(p) do { if (p) { free(p); (p) = NULL; } } while(0)
SAFE_FREE(str); // 直接使用,無類型轉換問題
#include
std::unique_ptr str(new char[100]); // 自動釋放,無需手動 free
// 或
std::vector buf(100); // 容器管理內存
釋放後內存未被覆寫,殘留數據偶然可讀,**純屬巧合**,屬未定義行為,不同編譯器/優化等級/運行環境結果不同。**切勿依賴此行為**。