首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 陣列指標刪除錯誤:為何不能單獨 delete 中間元素

     編輯:程式設計疑難解答

許多 C++ 初學者嘗試用 delete 釋放動態陣列中單一元素,導致 _BLOCK_TYPE_IS_VALID 執行時錯誤。本文解釋記憶體管理機制並給出正確替代方案。

錯誤原因

new int[10] 分配的是一塊連續記憶體區塊,delete[] 必須搭配 new[] 整體釋放。對區塊內部位址(如 &p[2])呼叫 delete 會破壞堆疊元資料,導致未定義行為。

正確做法

  1. 整體釋放:delete[] p; 釋放整個陣列。
  2. 若需動態增刪元素,改用 std::vector<int> 或鏈結串列(std::list),由容器管理記憶體。
  3. 若必須手動管理,可另行 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 個元素

理解陣列與單一物件記憶體配置差異,是避免記憶體錯誤的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved