7

做完之后说

Foo* array = new Foo[N];

我一直都是这样删的

delete[] array;

但是,有时我是这样看的:

delete[N] array;

由于它似乎可以编译和工作(至少在 msvc2005 中),我想知道:正确的方法是什么?那么为什么它会以另一种方式编译呢?

4

7 回答 7

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;
};

输出是:测试!!

所以表达式被计算但返回值被忽略。至少可以说我很惊讶,我想不出为什么需要这样做。

于 2009-11-17T10:53:10.167 回答
10

delete [N] array是无效的。它没有在 C++ 标准中定义:第 5.3.5 节将删除表达式定义为delete expror delete [] expr,仅此而已。它不能在 gcc(4.1.2 版)上编译。至于为什么它在 Visual C++ 中编译:问微软。

于 2009-11-17T10:51:13.217 回答
5

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

于 2009-11-17T10:44:04.417 回答
5

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

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

于 2009-11-17T10:44:14.637 回答
4

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

于 2009-11-17T10:44:06.773 回答
4

第一点:几乎没有充分的理由使用 new 或 delete 的数组形式开始 - 改用 std::vector (或其他容器)。

第二:回到 C++ 的黑暗时代,你必须指定要删除的数组的大小,所以如果你使用x = new T[N],匹配的删除是delete [N] x. 明确指定大小的要求很久以前就被删除了,但是一些编译器(尤其是那些关心与古代代码向后兼容的编译器)仍然允许它。

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

于 2009-11-17T15:01:31.387 回答
-2

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

delete [] array;   

是正确的形式。

delete array; 

有时也会起作用,但取决于实现(因此是错误的)。

于 2009-11-17T11:50:45.250 回答