0

我得到以下代码:

T *p = new T[10];
delete p;

我认为应该是 delete [] p。我在 T=int 类型上尝试过,没有错误。然后我创建了一个简单的类,异常。有什么明确的解释吗?

T *p = 0;
delete p;

他们怎么了?【我查了一下,好像虽然delete p会导致报错,但是程序恢复是因为编译器一开始就认为p==0,所以这个报错没关系。】

4

2 回答 2

5

是的,
你应该打电话 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&)

于 2013-01-20T13:56:49.150 回答
1

用 分配对象数组时new[],必须用 删除它delete[]。不这样做会导致Undefined Behavior

delete和之间的主要行为区别在于delete[]后者除了释放内存外,还调用数组中每个对象的析构函数。

考虑到你的第二点:

T *p = 0;
delete p;

这不会导致错误,而是什么都不做,因为这是delete指针为空时的预期行为。

于 2013-01-20T13:59:57.997 回答