繁体   English   中英

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

[英]ANSI C++: Differences between delete and delete[]

我正在寻找代码片段:

    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

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

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

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

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

在这种情况下,你必须使用delete []因为ip是一个数组。 无论如何,编译器永远不会给你一个错误(它可能会给你一个警告),但你可以得到运行时错误。

C ++规范要求您在删除数组时使用delete [] ,如果您担心交叉编译器兼容性或您的代码使用同一编译器的未来版本,那么您应该使用它。

您的运行时可能会选择为数组分配不同于单个对象的内存。 如果没有正确指出您的删除操作,那么您的代码可能无法正确释放内存。

所以,基本上,拨打正确的表格...... !!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM