C ++数组删除运算符语法

时间:2009-11-17 10:40:54

标签: c++ arrays delete-operator

在我这样做之后,说

Foo* array = new Foo[N];

我总是这样删除它

delete[] array;

然而,有时我会这样看:

delete[N] array;

因为它似乎在编译和工作(至少在msvc2005中),我想知道: 做正确的方法是什么? 那为什么要以其他方式编译呢?

7 个答案:

答案 0 :(得分: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;
};

输出是:测试!!

因此计算表达式但忽略返回值。 我很惊讶地说,至少我不能想到为什么需要这样做的场景。

答案 1 :(得分:10)

delete [N] array无效。它没有在C ++标准中定义:第5.3.5节将删除表达式定义为delete exprdelete [] expr,而不是其他任何内容。它不能在gcc(版本4.1.2)上编译。至于为什么它在Visual C ++中编译:问问Microsoft。

答案 2 :(得分:5)

delete[] array;是正确的表单。

答案 3 :(得分:5)

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:4)

第一点:几乎从来没有一个很好的理由使用new或delete的数组形式开始 - 使用std :: vector(或其他一些容器)代替。

第二:回到C ++的黑暗时代,您必须指定要删除的数组的大小,因此如果您使用x = new T[N],则匹配的删除是delete [N] x long 之前删除了明确指定大小的要求,但是一些编译器(特别是那些关心与古代代码向后兼容的编译器)仍然允许它。

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

答案 6 :(得分:-2)

如果有效,则是非标准扩展名。

delete [] array;   

是正确的形式。

delete array; 

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