記憶體分配和釋放配對不正確
如果物件只能由 new
分配並且不是陣列,則只能由 delete
釋放。如果 new
的引數未被 new
返回或者是陣列,則行為未定義。
如果物件只能由 new
分配並且是一個陣列,則只能由 delete[]
釋放。如果 delete[]
的引數未被 new
返回或者不是陣列,則行為未定義。
如果 malloc
沒有返回 free
的引數,則行為未定義。
int* p1 = new int;
delete p1; // correct
// delete[] p1; // undefined
// free(p1); // undefined
int* p2 = new int[10];
delete[] p2; // correct
// delete p2; // undefined
// free(p2); // undefined
int* p3 = static_cast<int*>(malloc(sizeof(int)));
free(p3); // correct
// delete p3; // undefined
// delete[] p3; // undefined
這些問題可以通過完全避免在 C++程式中使用 malloc
和 free
來避免,更喜歡標準庫智慧指標而不是原始 new
和 delete
,並且更喜歡 std::vector
和 std::string
而不是原始的 new
和 delete[]
。