ANSI C++:删除和删除[]之间的差异

Sun*_*een 2 c++

我正在寻找代码片段:

    int* ip;
    ip = new int[100];
    delete ip;
Run Code Online (Sandbox Code Playgroud)

上面的例子表明:

此代码适用于许多编译器,但它应该改为:

    int* ip;
    ip = new int[100];
    delete [] ip;
Run Code Online (Sandbox Code Playgroud)

确实如此吗?

我使用编译器"Microsoft(R)32位C/C++优化编译器版本11.00.7022 80x86"并且在编译时不抱怨(第一个例子).在运行时,指针设置为NULL.

其他编译器的行为有何不同?编译器可以不抱怨并且问题可以在运行时出现吗?

Don*_*ows 8

你应该总是delete []在杀死数组时使用它,因为它处理调用内容上的所有析构函数.我认为你在这里逃避它的原因是该int类型没有析构函数,但是当你转向使用析构函数创建对象数组时,你会真正看到它们的区别.

std::vector当然,对于总是使用而言,这是一个很好的论据.这一切都适合你.


小智 8

在这种情况下,编译器实际上没有办法产生错误 - 由new和产生的指针的类型new[]是相同的.当然,C++标准不需要对这种情况进行任何诊断.但是,您的第一个代码段对于所有编译器都是不正确的,并且会导致未定义的行为 - 不要试图这样做,因为编译器不会抱怨.

  • @Arkady也许它可以没有它,但它就在那里,编写忽略这个事实的代码是愚蠢而毫无意义的. (2认同)