新/新[]匹配是否应删除/删除[]?

时间:2010-12-18 23:23:53

标签: c++

我知道当我们使用new / new []分配内存时,我们应该分别使用delete / delete []释放内存。

以下是问题,

我可以使用delete []释放由new分配的内存吗?

例如,

int *pInt3 = new int;
delete [] pInt3;
pInt3 = NULL;

T *pT3 = new T;
delete [] pT3;
pT3 = NULL;

谢谢

3 个答案:

答案 0 :(得分:11)

不,您应该将非new的非数组形式与非数组delete匹配,同样也应该匹配数组表单。

请参阅C++ FAQ Lite section on Freestore Management

这特别好:http://www.parashift.com/c%2B%2B-faq-lite/freestore-mgmt.html#faq-16.12

  

[16.12]如果在删除通过新T [n]分配的数组时忘记了[]怎么办?

     

所有生命都陷入了灾难性的结局。

     

程序员 - 而不是编译器 - 负责使新T [n]和delete [] p之间的连接正确。如果输入错误,编译器将不会生成编译时错误消息或运行时错误消息。堆腐败可能是一个结果。或者更糟。你的程序可能会死。

答案 1 :(得分:5)

我猜你对标准的参考不满意,所以在这里。

您可以在标准C ++ 03中的3.7.3.2下找到它。

  

3提供给标准库中提供的一个释放函数的第一个参数的值可以是空指针值;如果是这样,对释放功能的调用无效。否则,标准库中提供给operator delete(void *)的值应该是之前调用标准库中的operator new(size_t)或operator new(size_t,const std :: nothrow_t&)返回的值之一。库,以及标准库中提供给operator delete [](void *)的值应该是前一次调用operator [](size_t)或operator new [](size_t,标准库中的const std :: nothrow_t&)

所以问题的答案是否定的。

答案 2 :(得分:1)

  

我可以使用delete []来释放   由new分配的内存?

是的,你可以,但如果你这样做,你会感到抱歉。