我认为在重新分配动态分配的指针以防止内存泄漏时,我们都理解delete
的必要性。但是,我很好奇,C ++在多大程度上要求使用delete
?例如,采用以下程序
int main()
{
int* arr = new int[5];
return 0;
}
虽然所有意图和目的都没有发生泄漏(因为你的程序结束了,操作系统会在返回后清理所有内存),但是标准是否仍需要 - 或建议 - 使用{{1 }} 在这种情况下?如果没有,是否有任何其他原因可以delete[]
在这里?
答案 0 :(得分:12)
标准中没有任何要求delete[]
的内容 - 但是,我认为这是一个非常好的指导方针。
但是,最好在每个delete
或delete[]
操作中使用new
或new[]
,即使程序终止也会清除内存
许多自定义对象都有一个析构函数,它可以执行其他逻辑,而不仅仅是清理内存。使用delete
可以保证在这些情况下的破坏。
此外,如果您在日常事务中移动,则不太可能在代码中的其他位置导致内存泄漏。
答案 1 :(得分:8)
Is there a reason to call delete in C++ when a program is exiting anyway?
的Dupe答案是因为需要运行的析构函数,有时需要在退出程序之前删除该对象。此外,如果您不这样做,许多内存泄漏检测工具会抱怨,因此为了更容易找到真正的内存泄漏,您应该在退出之前尝试删除所有对象。
答案 2 :(得分:6)
请参阅:
When to use "new" and when not to, in C++?
About constructors/destructors and new/delete operators in C++ for custom objects
delete and delete [] the same in Visual C++?
Why is there a special new and delete for arrays?
How to track memory allocations in C++ (especially new/delete)
答案 3 :(得分:2)
这里没有。但随着程序越来越大,越来越复杂,我会管理我的内存,这样我就可以更快地追踪错误。该标准除了在较小的情况下养成良好的习惯之外什么都不会导致长期更好的代码。
答案 4 :(得分:0)
您完全可以忘记删除内容。
你喜欢浪费记忆吗?
答案 5 :(得分:0)
我不知道标准版,但围绕这个问题有一种完整的编程风格:crash-only softxare 理论上数据库或操作系统内核应该这样开发,但通常使用它们并不是很实际,因为在重启时有一些清理可能很长。此外,依赖系统(OS或数据库客户端内的程序)可能不会崩溃。