C++ 是否删除单个对象数组?

C++ 是否删除单个对象数组?,c++,arrays,memory-management,C++,Arrays,Memory Management,我不确定这两个作品是否都要删除: p = new int[1]; delete p 及 如果两者都起作用,那么上述两个deletes之间的区别是什么?delete p只删除一个元素删除[]p删除数组。如果使用新类型[],则使用删除[] 如果您是new拥有[],则delete拥有[] 顺便说一句,在某个地方一定有一个确切的副本 一个实例的数组仍然是一个数组。这里没有特殊情况,所以需要将其视为数组而不是单个对象。非数组delete可能会崩溃 对象数组的前面可以有一个表示数组大小的数字。如果是这种

我不确定这两个作品是否都要删除:

p = new int[1];

delete p


如果两者都起作用,那么上述两个
delete
s之间的区别是什么?

delete p
只删除一个元素<代码>删除[]p删除数组。如果使用
新类型[]
,则使用
删除[]

如果您是
new
拥有
[]
,则
delete
拥有
[]


顺便说一句,在某个地方一定有一个确切的副本

一个实例的数组仍然是一个数组。这里没有特殊情况,所以需要将其视为数组而不是单个对象。非数组
delete
可能会崩溃


对象数组的前面可以有一个表示数组大小的数字。如果是这种情况,
delete[]
,而不是
delete
,足够聪明,可以将正确的指针传递到
free
,它们是不相同的。即使
delete p
会编译,但在运行时可能会导致问题

delete p
将调用
operator delete(void*)
其中as
delete[]
将调用
operator delete[](void*)
。默认行为是
delete[]
调用
delete
,但如果已实现
delete[]
的自定义运算符,则如果您只调用
delete
将不会调用该运算符,您将遇到问题(可能是无声的问题)


好的经验法则是,如果在
新建
中使用
[]
,请在
删除
中使用它

new
delete
必须匹配,否则您有未定义的行为。似乎在一个平台上工作是未定义行为的一种可能结果,这会严重破坏一切。不要这样做,这不是经验法则,不是要求。
delete [] p;