c++ - 为什么要删除new分配的内存呢?

标签 c++ garbage-collection

据说 new 分配的内存应该由 delete 释放,但现代桌面操作系统会回收内存,即使你不 删除它。那么我们为什么要deletenew分配的内存呢?

此外,assert 被称为不调用析构函数,它似乎在 STL 中被广泛使用(至少 VS2015 是这样)。如果建议删除new分配的内存(stringmapvector 使用析构函数删除分配的内存),为什么开发人员仍然使用大量的 assert

最佳答案

Why should we delete the memory allocated by new?

因为否则

  1. 内存泄漏。不泄漏内存对于服务器和守护程序等长时间运行的软件绝对至关重要,因为泄漏会累积并消耗所有可用内存。

  2. 不会调用对象的析构函数。程序的逻辑可能取决于被调用的析构函数。不调用某些析构函数也可能导致非内存资源泄漏。

Also assert is known as not calling the destructors

断言失败会终止整个进程,因此程序逻辑是否保持一致、内存或其他资源是否泄漏都无关紧要,因为进程无论如何都不会重用这些资源。

and it seems like it's widely used in STL (at least VS2015 does that)

准确地说,我认为标准库并没有指定使用断言宏。它可以使用它的唯一情况是你有未定义的行为。如果您有 UB,那么内存泄漏是您最不担心的事情。


如果您知道该对象的析构函数是微不足道的,并且您知道该对象在整个程序中都在使用(因此,它本质上是一个单例),那么故意泄露该对象是非常安全的。这确实有一个缺点,即它会被内存泄漏清理器检测到,您可能希望使用它来检测意外内存泄漏。

关于c++ - 为什么要删除new分配的内存呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693796/

相关文章:

java - 当老一代的jvm超过某个比例时如何自动转储内存?

memory-management - 使用道场后如何清理?

Ruby 强制垃圾收集无法按预期工作

c++ - 计算排序算法中的执行时间

java - 使用 7mb RAM 的 Android FinalizerReference

c++ - 递归函数的渐近时间复杂度

当基类具有两个或多个模板参数时,c++11 别名基模板类变量在模板派生类中不起作用

c++ - C++中通过第一个对象创建第二个对象时,第一个对象到哪里去了?

c++ - 如何从静态函数返回指向 const 的指针?

c# - 如何轻松地为一段 C# 代码计时?