在我使用下面这行代码后
Foo* array = new Foo[N];
我通常会使用以下方式来释放它
delete[] array;
然而,有时候我会看到以下这种写法:
delete[N] array;
虽然这种写法好像编译并且工作正常(至少在msvc2005中),但我想知道:
什么是正确的做法?
为什么另一种方式也可以编译通过呢?
在我使用下面这行代码后
Foo* array = new Foo[N];
我通常会使用以下方式来释放它
delete[] array;
然而,有时候我会看到以下这种写法:
delete[N] array;
虽然这种写法好像编译并且工作正常(至少在msvc2005中),但我想知道:
什么是正确的做法?
为什么另一种方式也可以编译通过呢?
int test()
{
std::cout<<"Test!!\n";
return 10;
}
int main()
{
int* p = new int[10];
delete[test()] p;
return 0;
};
输出为:Test!!
因此,表达式被计算但返回值被忽略了。我很惊讶,至少我无法想到这是为什么需要的情况。
delete [N] array
是无效的。在C++标准中没有定义这个语法:第5.3.5节定义了删除表达式,它只有 delete expr
或者 delete [] expr
两种形式,没有其他形式。在gcc(4.1.2版本)中无法编译。至于为什么在Visual C++中可以编译: 请问微软。
delete[] array;
is the correct form.
delete[] array;
。我甚至不知道delete[N] array;
会编译通过(我怀疑它应该不会)。N
被计算,但被忽略了。这个描述与实际情况无关,但它描述了如果你写了delete[N++] array;
会发生什么——N首先增加,然后被忽略了。 - MSalters第一点:几乎从来没有一个好的理由要使用数组形式的new或delete -- 而应该改用std::vector(或其他容器)。
第二点:回到C++的黑暗年代,你必须指定删除的数组大小,如果你使用了x = new T[N]
,匹配的delete语句则是delete [N] x
。显式指定大小的要求早已被移除很久了,但一些编译器(特别是那些关心与古老代码向后兼容性的编译器)仍然允许这样做。
除非你确实需要保持与古老编译器(大约20年前的编译器)的兼容性,否则你不应该使用它。再说,除非你需要保持与一个不支持任何标准容器的老编译器的兼容性,否则你根本不应该使用new或delete的数组形式。请停止使用!
如果它能工作,那就是一个非标准扩展。
delete [] array;
是正确的形式。
delete array;
有时候也可以工作,但这取决于实现(因此是错误的)。