C++ 内存泄漏的长期后果是什么?

C++ 内存泄漏的长期后果是什么?,c++,memory,C++,Memory,假设我有一个这样的程序: int main(void) { int* arr = new int[x]; //processing; neglect to call delete[] return 0; } 在这样一个简单的例子中,我假设忽略释放分配给arr的内存没有什么实际危害,因为当程序运行完毕时,操作系统应该释放内存。然而,对于任何非平凡的程序,这被认为是不好的做法,并将导致内存泄漏 我的问题是,在一个非平凡的程序中,内存泄漏的后果是什么?我意识到内存泄漏是一种不

假设我有一个这样的程序:

int main(void)
{
    int* arr = new int[x];
    //processing; neglect to call delete[]
    return 0;
}
在这样一个简单的例子中,我假设忽略释放分配给
arr
的内存没有什么实际危害,因为当程序运行完毕时,操作系统应该释放内存。然而,对于任何非平凡的程序,这被认为是不好的做法,并将导致内存泄漏


我的问题是,在一个非平凡的程序中,内存泄漏的后果是什么?我意识到内存泄漏是一种不好的做法,但我不明白它们为什么不好以及它们会引起什么麻烦。

现在编译器在生成二进制文件之前对代码进行一些优化。因此,不删除单个newing不会有太大的危害

但一般来说,通过进行任何“更新”,您应该“删除”程序中保留的那部分内存

还要注意,简单的删除并不能保证不会耗尽内存。 O.S.和编译器方面有不同的方面来控制此功能


内存泄漏会减少可用内存量,从而降低计算机的性能。最终,在最坏的情况下,可能会分配过多的可用内存,系统或设备的全部或部分停止正常工作,应用程序失败,或系统因抖动而无法接受地减速

内存泄漏可能不严重,甚至无法通过正常方式检测到。在现代操作系统中,应用程序使用的普通内存在应用程序终止时释放。这意味着程序中只运行很短时间的内存泄漏可能不会被注意到,而且很少严重

更严重的泄漏包括:

  • 程序长时间运行并随时间消耗额外内存的情况,例如服务器上的后台任务,但特别是在可能运行多年的嵌入式设备中
  • 经常为一次性任务分配新内存,例如在渲染计算机游戏或动画视频的帧时
  • 程序可以请求未释放的内存(如共享内存),即使程序终止
  • 在内存非常有限的情况下,例如在嵌入式系统或便携式设备中
  • 在操作系统或内存管理器中发生泄漏
  • 当系统设备驱动程序导致泄漏时
  • 在程序终止时不会自动释放内存的操作系统上运行。在这样的机器上,如果内存丢失,通常只能通过重新启动来回收,例如AmigaOS

查看更多信息。

假设我们正在运行此程序:

while(true)
{
    int* arr = new int;
}
短期的问题是,您的计算机最终将耗尽内存,程序将崩溃

相反,我们可以让这个程序永远运行,因为没有内存泄漏:

while(true)
{
    int* arr = new int;
    delete arr;
}
当这样一个简单的程序崩溃时,不会有长期的后果,因为操作系统会在崩溃后释放内存

但您可以想象,在更关键的系统中,系统崩溃将产生灾难性后果,例如:

while(true)
{
    int* arr = new int;
    generateOxygenForAstronauts();
}

想想宇航员,释放你的记忆

如您的示例所示,运行一段短时间然后退出的工具通常可以避免内存泄漏。但是,一个预期可以长时间无故障运行的程序必须完全没有内存泄漏。正如其他人所提到的,整个系统将首先陷入困境。此外,泄漏内存的代码在处理分配失败时通常非常糟糕——分配失败的结果通常是崩溃和数据丢失。从用户的角度来看,这种崩溃通常发生在最糟糕的时刻(例如,在文件保存期间,当分配文件缓冲区时)。

好吧,这是一个奇怪的问题,因为直接的答案很简单:当内存泄漏导致内存丢失时,您可能/最终会耗尽内存。对于特定程序而言,问题的严重程度取决于每次泄漏的严重程度、泄漏发生的频率和持续时间。就这些

分配相对较低内存量和/或不连续运行的程序可能根本不会出现内存泄漏问题。但是一个持续运行的程序最终会耗尽内存,即使它泄漏的速度非常慢

现在,如果你决定更仔细地观察它,每个内存块都有两面:它占据进程地址空间中的一个地址区域,并占据实际物理存储的一部分

在一个没有虚拟内存的平台上,双方都与您作对。一旦内存块泄漏,就会丢失地址空间和存储器

在具有虚拟内存的平台上,实际存储实际上是一种无限的资源。您可以泄漏任意多的内存,您永远不会耗尽实际存储空间(当然,在实际合理的范围内)。泄漏的内存块最终会被推到外部存储器中并被永久遗忘,因此它不会以任何负面方式直接影响程序。但是,它仍将保留其地址空间区域。而且地址空间仍然是一个有限的资源,您可能会用完它


可以说,如果我们使用一个虚拟内存平台,其地址空间比我们的进程所消耗的任何东西都要大(比如2048位平台和一个典型的文本编辑器),那么内存泄漏将不会对我们的程序产生任何后果。但在现实生活中,内存泄漏通常是一个严重的问题。

你的问题有一个基本假设:

delete
delete[]
的作用是单独释放内存

。。。而且我