内存分配和释放配对不正确
如果对象只能由 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[]
。