我正在寻找代码片段:
int* ip;
ip = new int[100];
delete ip;
上面的例子表明:
此代码适用于许多编译器,但应改为:
int* ip;
ip = new int[100];
delete [] ip;
确实如此吗?
我使用编译器“Microsoft(R)32位C / C ++优化编译器版本11.00.7022用于80x86”并且在编译时不会抱怨(第一个示例)。在运行时,指针设置为NULL
。
其他编译器的行为有何不同?编译器可以不抱怨并且问题可以在运行时出现吗?
答案 0 :(得分:8)
在杀死数组时,总是使用delete []
,因为它处理调用内容上的所有析构函数。我认为你在这里摆脱它的原因是int
类型没有析构函数,但是当你转向使用析构函数创建对象数组时,你会真正看到它们的区别。 / p>
当然,总是使用std::vector
这是一个很好的理由。这让所有这些东西都适合你。
答案 1 :(得分:8)
在这种情况下,编译器根本没有办法产生错误 - new
和new[]
生成的指针类型是相同的。当然,C ++标准不需要对这种情况进行任何诊断。但是,您的第一个代码段对于所有编译器都是不正确的,并且会导致未定义的行为 - 不要试图这样做,因为编译器不会抱怨。
答案 2 :(得分:4)
在这种情况下,您必须使用delete []
,因为ip
是一个数组。无论如何,编译器永远不会给你一个错误(它可能会给你一个警告),但是你可以得到运行时错误。
答案 3 :(得分:3)
C ++规范要求您在删除数组时使用 delete [] ,如果您担心交叉编译器兼容性或您的代码使用相同编译器的未来版本,那么您应该使用它
您的运行时可能会选择为数组分配不同于单个对象的内存。如果没有正确指出您的删除操作,那么您的代码可能无法正确释放内存。
所以,基本上,打电话给正确的表格...... !!!