内存分配和释放配对不正确

如果对象只能由 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++程序中使用 mallocfree 来避免,更喜欢标准库智能指针而不是原始 newdelete,并且更喜欢 std::vectorstd::string 而不是原始的 newdelete[]