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

rav*_*ven 7 c++ arrays delete-operator

我之后,说

Foo* array = new Foo[N];

我总是这样删除它

delete[] array;

但是,有时候我这样看过:

delete[N] array;

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

Nav*_*een 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;
};
Run Code Online (Sandbox Code Playgroud)

输出是:测试!!

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

  • 我的猜测是,这种语法在 C++ 的标准前方言中是有效的,因此对于依赖于表达式副作用的假设的古代代码,需要“评估并忽略”行为。更令我惊讶的是,在任何现代编译器中都会默认启用对此语法的支持。 (2认同)

Mik*_*our 10

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


lau*_*ura 5

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


Myk*_*yev 5

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

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

  • "Visual Studio编译了许多它不应该做的事情." 阿门. (4认同)