我正在寻找代码片段:
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.
其他编译器的行为有何不同?编译器可以不抱怨并且问题可以在运行时出现吗?
你应该总是delete []在杀死数组时使用它,因为它处理调用内容上的所有析构函数.我认为你在这里逃避它的原因是该int类型没有析构函数,但是当你转向使用析构函数创建对象数组时,你会真正看到它们的区别.
std::vector当然,对于总是使用而言,这是一个很好的论据.这一切都适合你.
小智 8
在这种情况下,编译器实际上没有办法产生错误 - 由new和产生的指针的类型new[]是相同的.当然,C++标准不需要对这种情况进行任何诊断.但是,您的第一个代码段对于所有编译器都是不正确的,并且会导致未定义的行为 - 不要试图这样做,因为编译器不会抱怨.