我不确定这些是否都可以删除:
p = new int[1];
delete p
和
delete [] p;
如果两者都有效,上述两个delete
之间有什么区别?
答案 0 :(得分:4)
一个实例的数组仍然是一个数组。根本没有特殊情况,因此您需要将其视为数组而不是单个对象。非数组delete
可能会崩溃。
对象数组前面可能有一个表示数组大小的数字。如果是这种情况,delete[]
,而不是delete
,足够聪明,可以将正确的指针传递给free
。
答案 1 :(得分:2)
他们不相同。即使delete p
会编译但可能在运行时导致问题。
delete p
将调用operator delete(void*)
,delete []
将调用operator delete[](void*)
。默认行为是delete[]
调用delete
,但如果已实施delete []
的自定义运算符,则只需调用delete
即可调用[]
会有问题(可能是一个问题)。
良好的经验法则是,如果您在new
中使用了delete
,请在{{1}}中使用它。
答案 2 :(得分:1)
delete p
只删除一个元素。 delete [] p
删除一个数组。如果您使用new type[]
,请使用delete []
。
如果您new
有[]
,那么delete
会有[]
。
顺便说一句,必须要有一个完全重复的地方。