做完之后说
Foo* array = new Foo[N];
我一直都是这样删的
delete[] array;
但是,有时我是这样看的:
delete[N] array;
由于它似乎可以编译和工作(至少在 msvc2005 中),我想知道:正确的方法是什么?那么为什么它会以另一种方式编译呢?
做完之后说
Foo* array = new Foo[N];
我一直都是这样删的
delete[] array;
但是,有时我是这样看的:
delete[N] array;
由于它似乎可以编译和工作(至少在 msvc2005 中),我想知道:正确的方法是什么?那么为什么它会以另一种方式编译呢?
您可以查看此 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;
};
输出是:测试!!
所以表达式被计算但返回值被忽略。至少可以说我很惊讶,我想不出为什么需要这样做。
delete [N] array
是无效的。它没有在 C++ 标准中定义:第 5.3.5 节将删除表达式定义为delete expr
or delete [] expr
,仅此而已。它不能在 gcc(4.1.2 版)上编译。至于为什么它在 Visual C++ 中编译:问微软。
delete[] array;
是正确的形式。
无论第二种情况是否正确,我都建议使用第一种,因为它不易出错。
Visual Studio 编译了很多它不应该编译的东西。
正确的做法是做delete[] array;
。我什至不知道delete[N] array;
会编译(我怀疑它应该编译)。
第一点:几乎没有充分的理由使用 new 或 delete 的数组形式开始 - 改用 std::vector (或其他容器)。
第二:回到 C++ 的黑暗时代,你必须指定要删除的数组的大小,所以如果你使用x = new T[N]
,匹配的删除是delete [N] x
. 明确指定大小的要求很久以前就被删除了,但是一些编译器(尤其是那些关心与古代代码向后兼容的编译器)仍然允许它。
除非你真的需要与一个古老的编译器(大约 20 岁左右的编译器)保持兼容,否则你不应该使用它。再说一次,除非您需要与一个不支持任何标准容器的旧编译器保持兼容,否则您不应该首先使用 new 或 delete 的数组形式。停下来!
如果它有效,它是一个非标准的扩展。
delete [] array;
是正确的形式。
delete array;
有时也会起作用,但取决于实现(因此是错误的)。