在我这样做之后,说
Foo* array = new Foo[N];
我总是这样删除它
delete[] array;
然而,有时我会这样看:
delete[N] array;
因为它似乎在编译和工作(至少在msvc2005中),我想知道: 做正确的方法是什么? 那为什么要以其他方式编译呢?
答案 0 :(得分:13)
您可以查看此MSDN链接:delete[N] operator。该值被忽略。
修改强> 我在VC9上尝试了这个示例代码:
int test()
{
std::cout<<"Test!!\n";
return 10;
}
int main()
{
int* p = new int[10];
delete[test()] p;
return 0;
};
输出是:测试!!
因此计算表达式但忽略返回值。 我很惊讶地说,至少我不能想到为什么需要这样做的场景。
答案 1 :(得分:10)
delete [N] array
无效。它没有在C ++标准中定义:第5.3.5节将删除表达式定义为delete expr
或delete [] expr
,而不是其他任何内容。它不能在gcc(版本4.1.2)上编译。至于为什么它在Visual C ++中编译:问问Microsoft。
答案 2 :(得分:5)
delete[] array;
是正确的表单。
答案 3 :(得分:5)
第二种情况是否正确我建议使用第一种情况,因为它不易出错。
Visual Studio编译了许多不应该的东西。
答案 4 :(得分:4)
正确的方法是delete[] array;
。我甚至不知道delete[N] array;
会编译(我怀疑它应该)。
答案 5 :(得分:4)
第一点:几乎从来没有一个很好的理由使用new或delete的数组形式开始 - 使用std :: vector(或其他一些容器)代替。
第二:回到C ++的黑暗时代,您必须指定要删除的数组的大小,因此如果您使用x = new T[N]
,则匹配的删除是delete [N] x
。 long 之前删除了明确指定大小的要求,但是一些编译器(特别是那些关心与古代代码向后兼容的编译器)仍然允许它。
除非你真的需要与古老的编译器(一个20岁左右的编译器)保持兼容,否则你不应该使用它。然后,除非你需要保持与旧的编译器兼容它不支持任何标准容器,否则你不应该首先使用new或者数组形式。停下来!
答案 6 :(得分:-2)
如果有效,则是非标准扩展名。
delete [] array;
是正确的形式。
delete array;
有时也会起作用,但依赖于实现(因此是错误的)。