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

q09*_*987 0 c++

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

这是问题,

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

例如,

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

T *pT3 = new T;
delete [] pT3;
pT3 = NULL;
Run Code Online (Sandbox Code Playgroud)

谢谢

wkl*_*wkl 11

不,您应该将非数组形式new与非数组匹配delete,对于数组形式也是如此.

请参阅Freestore ManagementC++ FAQ Lite部分

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

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

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

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


Mag*_*rmo 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&)在标准库中.

所以你的问题的答案是否定的.