2009-11-17 213 views
7

后,我做的,说C++数组delete操作符语法

Foo* array = new Foo[N];

我一直删除了这样

delete[] array;

不过,有时候我已经看到了这种方式:

delete[N] array;

因为它似乎编译和工作(至少在msvc2005),我想知道: 什么是正确的方法来做到这一点? 为什么它以另一种方式进行编译?

回答

13

您可以点击以下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; 
}; 

输出是:测试!!

因此表达式被计算,但返回值被忽略。 我很惊讶地说至少,我想不出为什么这是必需的情况。

+0

+1。有用的信息 – 2009-11-17 11:01:46

+0

是否意味着你可以删除[2N]数组;那会编译 – 2009-11-17 11:03:16

+0

谢谢,这就是我一直在寻找的东西。 – raven 2009-11-17 11:07:58

5

delete[] array;是正确的形式。

4

正确的方法是做delete[] array;。我甚至不知道delete[N] array;会编译(我怀疑它应该)。

+1

它在VC9上编译时出现'warning C4208:使用非标准扩展:delete [exp] - exp评估但忽略'我不是那个意思,虽然 – Naveen 2009-11-17 10:48:55

+1

这意味着代码是(1)无效的C++和2)表达式“N”被评估但被忽略。这是相当无关紧要的,但它描述了如果您编写'delete [N ++] array;' - N首先增加,然后被忽略会发生什么。 – MSalters 2009-11-17 14:12:41

+0

真的,它首先被忽略,然后递增:) – raven 2009-11-26 17:22:10

5

第二种情况是否正确我建议使用第一种,因为它不太容易出错。

Visual Studio编译了很多它不应该的东西。

+4

“Visual Studio编译了很多它不应该的东西。”阿门。 – sbi 2009-11-17 10:45:35

10

delete [N] array无效。它没有在C++标准中定义:5.3.5节将删除表达式定义为delete exprdelete [] expr,除此之外别无其他。它不会在gcc(版本4.1.2)上编译。至于为什么它在Visual C++中编译:请问微软。

+0

哪个C++标准?而且,你有链接/参考,哪里可以找到它? – Kissaki 2011-10-03 10:55:37

+1

@Kissaki:我会指的是C++ 03,它在网上没有合法的可用性。然而,该措词是在C++ 11很相似,其草案可在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf – 2011-10-03 11:04:22

+0

啊,谢谢.. – Kissaki 2011-10-03 20:37:57

-2

如果它有效,它是一个非标准扩展。

delete [] array; 

是正确的形式。

delete array; 

有时也会工作,但依赖于实现(因此是错误的)。

+1

对于非数组指针,明确定义了第二种形式(不包含括号)的行为。它的行为不是。无论如何,我想这就是为什么有人投你一票。 – 2009-11-17 13:33:04

+1

'删除数组'在任何意义上都不“起作用”,除非你的意思是它不会使程序崩溃。它不会回收首先分配的所有内存,如果它没有崩溃,它只会在数组中的第一个对象上运行析构函数。 (如果你做了新的Foo [0]',那么这也是一个错误。) – Bill 2009-11-17 14:39:48

+1

@Bill:我希望我能够评论评论。你的陈述有时候可能是真的,有时候它可能不对。在这里看到:http://stackoverflow.com/questions/1553382/1553407#1553407和我的评论在这里:http://stackoverflow.com/questions/1553382/1553391#1553391 – sbi 2009-11-17 15:28:05

4

第一点:几乎从来没有一个很好的理由使用新的或删除的数组形式开始 - 使用std :: vector(或其他容器)。第二:在C++的黑暗时代,你必须指定你正在删除的数组的大小,所以如果你使用了x = new T[N],那么匹配的删除是delete [N] x。明确指定大小的要求在以前被移除了long,但是一些编译器(特别是那些关心与古代代码的向后兼容性的编译器)仍然允许它。

,除非你真的需要保持一个古老的编译器(一个是20岁左右)兼容,你不应该使用它。然后再说一遍,除非你需要与一个如此老的编译器保持兼容,否则它不支持任何标准容器,你不应该首先使用new或delete的数组形式。停下来!

+0

感谢您的历史课。 然后,如果我必须通过的,动态数组说,花车,向第三方libray,这是正确的方式做到这一点王氏标准集装箱? – raven 2009-11-17 15:28:53

+0

使用矢量。当您需要传递地址/长度时,请使用&vec [0]和vec.size()。 – 2009-11-17 15:55:52

+0

+1:在标准的'94草案中,语法已经是'delete []'了。同一年,Design and Evolution(p218)评论说这个语法“...证明太容易出错,所以跟踪元素数量的负担被放在实现上。” – 2009-11-17 17:42:43