我得到以下代码:
T *p = new T[10];
delete p;
我认为应该是 delete [] p。我在 T=int 类型上尝试过,没有错误。然后我创建了一个简单的类,异常。有什么明确的解释吗?
T *p = 0;
delete p;
他们怎么了?【我查了一下,好像虽然delete p会导致报错,但是程序恢复是因为编译器一开始就认为p==0,所以这个报错没关系。】
我得到以下代码:
T *p = new T[10];
delete p;
我认为应该是 delete [] p。我在 T=int 类型上尝试过,没有错误。然后我创建了一个简单的类,异常。有什么明确的解释吗?
T *p = 0;
delete p;
他们怎么了?【我查了一下,好像虽然delete p会导致报错,但是程序恢复是因为编译器一开始就认为p==0,所以这个报错没关系。】
是的,
你应该打电话 delete [] p;
有什么明确的解释吗?
这是未定义的行为:
delete
分配完成时调用new []
delete
非动态分配的指针。请注意,未定义的行为意味着任何事情都可能发生,它不要求崩溃。它只是意味着您的程序可以显示任何行为(包括按预期工作)。
调用指针是完全有效delete
的。NULL
该标准允许这样做。操作员在delete
内部承担核心,调用者不必费心NULL
检查。
参考:
C++03 标准§3.7.4.2-3:
如果释放函数因抛出异常而终止,则行为未定义。提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。否则,
delete(void*)
在标准库中提供给 operator 的值应是先前调用任一运算符new(std::size_t)
或operator new(std::size_t, const std::nothrow_-t&)
在标准库中返回的值之一,并且提供给delete[](void*)
标准库中 operator 的值应是由 a 返回的值之一在标准库中调用operator new[](std::size_t)
或 调用。operator new[](std::size_t, const std::nothrow_t&)
用 分配对象数组时new[]
,必须用 删除它delete[]
。不这样做会导致Undefined Behavior。
delete
和之间的主要行为区别在于delete[]
后者除了释放内存外,还调用数组中每个对象的析构函数。
考虑到你的第二点:
T *p = 0;
delete p;
这不会导致错误,而是什么都不做,因为这是delete
指针为空时的预期行为。