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,所以这个错误并不重要.]
是的,
你应该打电话 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&)在标准库中.