C++:以下代码有什么问题?

use*_*880 0 c++ templates pointers memory-leaks memory-management

我得到了以下代码:

T *p = new T[10];
delete p;
Run Code Online (Sandbox Code Playgroud)

它应该是删除[] p,我想.我在T = int类型上尝试过它,没有错误.然后我创建了一个简单的类,异常.任何明确的解释?

T *p = 0;
delete p;
Run Code Online (Sandbox Code Playgroud)

他们怎么了?[我查了一下,似乎虽然删除p会导致错误,但程序恢复因为编译器首先认为p == 0,所以这个错误并不重要.]

Alo*_*ave 5

是的,
你应该打电话 delete [] p;

任何明确的解释?

它是未定义的行为:

  • delete如果分配完成则调用new []
  • 调用delete非动态分配的指针.

请注意,未定义的行为意味着任何事情都可能发生,它不会导致崩溃.它只是意味着您的程序可以显示任何行为(包括按预期工作).

这是完全有效的调用delete上的NULL指针.该标准允许.该delete运营商内部采用的是核心,调用者不必理会NULL检查.


参考文献:

C++ 03标准§3.7.4.2-3:

如果通过抛出异常终止释放函数,则行为未定义.提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.否则,delete(void*)在标准库中提供给操作符的值应该是先前调用任何操作符new(std::size_t)operator new(std::size_t, const std::nothrow_-t&)在标准库中返回的值之一,并且提供给delete[](void*)标准库中的操作符的值应该是由a返回的值之一.以前调用任何一个operator new[](std::size_t)operator new[](std::size_t, const std::nothrow_t&)在标准库中.