后,我做的,说C++数组delete操作符语法
Foo* array = new Foo[N];
我一直删除了这样
delete[] array;
不过,有时候我已经看到了这种方式:
delete[N] array;
因为它似乎编译和工作(至少在msvc2005),我想知道: 什么是正确的方法来做到这一点? 为什么它以另一种方式进行编译?
后,我做的,说C++数组delete操作符语法
Foo* array = new Foo[N];
我一直删除了这样
delete[] array;
不过,有时候我已经看到了这种方式:
delete[N] array;
因为它似乎编译和工作(至少在msvc2005),我想知道: 什么是正确的方法来做到这一点? 为什么它以另一种方式进行编译?
您可以点击以下MSDN链接:delete[N] operator。该值被忽略。
EDIT 我试图上VC9此示例代码:
int test()
{
std::cout<<"Test!!\n";
return 10;
}
int main()
{
int* p = new int[10];
delete[test()] p;
return 0;
};
输出是:测试!!
因此表达式被计算,但返回值被忽略。 我很惊讶地说至少,我想不出为什么这是必需的情况。
delete[] array;
是正确的形式。
正确的方法是做delete[] array;
。我甚至不知道delete[N] array;
会编译(我怀疑它应该)。
第二种情况是否正确我建议使用第一种,因为它不太容易出错。
Visual Studio编译了很多它不应该的东西。
“Visual Studio编译了很多它不应该的东西。”阿门。 – sbi 2009-11-17 10:45:35
delete [N] array
无效。它没有在C++标准中定义:5.3.5节将删除表达式定义为delete expr
或delete [] expr
,除此之外别无其他。它不会在gcc(版本4.1.2)上编译。至于为什么它在Visual C++中编译:请问微软。
如果它有效,它是一个非标准扩展。
delete [] array;
是正确的形式。
delete array;
有时也会工作,但依赖于实现(因此是错误的)。
对于非数组指针,明确定义了第二种形式(不包含括号)的行为。它的行为不是。无论如何,我想这就是为什么有人投你一票。 – 2009-11-17 13:33:04
'删除数组'在任何意义上都不“起作用”,除非你的意思是它不会使程序崩溃。它不会回收首先分配的所有内存,如果它没有崩溃,它只会在数组中的第一个对象上运行析构函数。 (如果你做了新的Foo [0]',那么这也是一个错误。) – Bill 2009-11-17 14:39:48
@Bill:我希望我能够评论评论。你的陈述有时候可能是真的,有时候它可能不对。在这里看到:http://stackoverflow.com/questions/1553382/1553407#1553407和我的评论在这里:http://stackoverflow.com/questions/1553382/1553391#1553391 – sbi 2009-11-17 15:28:05
第一点:几乎从来没有一个很好的理由使用新的或删除的数组形式开始 - 使用std :: vector(或其他容器)。第二:在C++的黑暗时代,你必须指定你正在删除的数组的大小,所以如果你使用了x = new T[N]
,那么匹配的删除是delete [N] x
。明确指定大小的要求在以前被移除了long,但是一些编译器(特别是那些关心与古代代码的向后兼容性的编译器)仍然允许它。
,除非你真的需要保持一个古老的编译器(一个是20岁左右)兼容,你不应该使用它。然后再说一遍,除非你需要与一个如此老的编译器保持兼容,否则它不支持任何标准容器,你不应该首先使用new或delete的数组形式。停下来!
感谢您的历史课。 然后,如果我必须通过的,动态数组说,花车,向第三方libray,这是正确的方式做到这一点王氏标准集装箱? – raven 2009-11-17 15:28:53
使用矢量。当您需要传递地址/长度时,请使用&vec [0]和vec.size()。 – 2009-11-17 15:55:52
+1:在标准的'94草案中,语法已经是'delete []'了。同一年,Design and Evolution(p218)评论说这个语法“...证明太容易出错,所以跟踪元素数量的负担被放在实现上。” – 2009-11-17 17:42:43
+1。有用的信息 – 2009-11-17 11:01:46
是否意味着你可以删除[2N]数组;那会编译 – 2009-11-17 11:03:16
谢谢,这就是我一直在寻找的东西。 – raven 2009-11-17 11:07:58