許多 C++ 初學者嘗試用 delete 釋放動態陣列中單一元素,導致 _BLOCK_TYPE_IS_VALID 執行時錯誤。本文解釋記憶體管理機制並給出正確替代方案。
new int[10] 分配的是一塊連續記憶體區塊,delete[] 必須搭配 new[] 整體釋放。對區塊內部位址(如 &p[2])呼叫 delete 會破壞堆疊元資料,導致未定義行為。
delete[] p; 釋放整個陣列。std::vector<int> 或鏈結串列(std::list),由容器管理記憶體。new 單一物件,但失去陣列連續存取優勢。// 錯誤示範
int* p = new int[10];
int* q = &p[2];
delete q; // 執行時錯誤
// 正確釋放
delete[] p;
// 推薦用 vector
std::vector<int> vec(10);
vec.erase(vec.begin() + 2); // 安全刪除第 3 個元素
理解陣列與單一物件記憶體配置差異,是避免記憶體錯誤的關鍵。