C 如果虚拟环境中存在内存泄漏怎么办?

C 如果虚拟环境中存在内存泄漏怎么办?,c,memory,memory-management,C,Memory,Memory Management,通过阅读一些web文章,我了解到,就像任何其他程序一样,主机操作系统为虚拟操作系统分配X个内存量,当我在虚拟操作系统上启动任何程序时,虚拟操作系统获取程序所需的确切内存量 当我关闭虚拟操作系统时,它会将分配的内存返回给主机操作系统 但是,如果虚拟操作系统环境中存在内存泄漏,会发生什么情况?我开始学习C语言,我的教授说,在动态内存分配操作中,主机操作系统中可能会发生永久性泄漏 但如果它发生在虚拟环境中呢?我想当我关闭主机操作系统时,该程序将返回分配给它的所有内存,对吗?下次再次启动虚拟主机时会发生

通过阅读一些web文章,我了解到,就像任何其他程序一样,主机操作系统为虚拟操作系统分配X个内存量,当我在虚拟操作系统上启动任何程序时,虚拟操作系统获取程序所需的确切内存量

当我关闭虚拟操作系统时,它会将分配的内存返回给主机操作系统

但是,如果虚拟操作系统环境中存在内存泄漏,会发生什么情况?我开始学习C语言,我的教授说,在动态内存分配操作中,主机操作系统中可能会发生永久性泄漏

但如果它发生在虚拟环境中呢?我想当我关闭主机操作系统时,该程序将返回分配给它的所有内存,对吗?下次再次启动虚拟主机时会发生什么情况?内存泄漏是否永久性地出现在那里

在我开始用C写我的第一个程序之前就开始害怕了


另外,如果我使用像Repl.it这样的网站并在那里使用内存分配,它还会对我的系统造成损坏吗?

当您分配一些内存(使用C中的
malloc
)而您从未释放该内存时,可能会发生内存泄漏,原因有很多

现在需要了解的重要一点是,一旦进程完成运行,这个分配的内存将被释放

当你设置你的虚拟机时,你可以设置它能消耗的最大内存量。当你关闭你的虚拟机时,它也会被释放

如果您编写的程序未运行,则不会导致“永久”内存泄漏。如果操作系统有一些总是在运行的服务存在内存泄漏,那么当内存不足时,它会减慢速度,但当您重新启动时,所有内存将再次释放

所以不要让这阻止你,你不能损坏你的电脑,你可以通过退出程序来恢复它。(或在最坏情况下重新启动电脑 )

编辑:


正如评论中提到的,当泄漏共享内存时有一个特殊的场景,在这种情况下退出程序可能不会释放内存,但我认为这是最坏的情况,而重新启动也将解决这个问题。(仍然不是永久性的)

除了我同意的好答案和评论之外,这个答案旨在提供一个不同的观点

我正试图看到最坏的情况,也就是说,一种你可以得到你所害怕的东西的方法。 您可能有一个与以下假设不匹配的环境,在这种情况下,我的构造当然不适用

  • 您的虚拟操作系统支持“持久性”
    (也就是说,您可以以“休眠”方式关闭它,它可以从相同的运行进程及其恢复的内存内容开始)
  • 您的虚拟化引擎还支持虚拟操作系统的持久性
  • 在虚拟操作系统中,如果进程占用了关键内存量,则可以关闭以实现持久性(健全性检查可以防止这种情况发生)
  • 虚拟化引擎也不介意内存耗尽,并允许持久化
  • 您选择使用持续关机,
    重启虚拟操作系统通常包括杀死邪恶进程和回收内存(其他答案和评论对此进行了讨论,但感谢Blaise先生在这里提出的澄清)
在这种情况下,我认为您可以:

  • 占用(并耗尽)所有可用内存的进程
  • 但没有坠毁或以其他方式触发紧急措施
  • 然后,在成功关闭之前,将此情况保存为持久性
  • 然后重新启动虚拟操作系统
  • 它恢复以前的情况,即从休眠状态返回
  • 恢复的前一种情况包含一个仍然/再次运行的进程,该进程占用了所有内存
我认为这仍然只会影响虚拟操作系统,而不会影响主机

请注意,我故意做了所有必要的假设,只是为了得到你害怕的情况。有些假设相当“大胆”。
例如,我设想任何支持持久性的东西都应该有健全性检查,这至少可以检测内存问题并询问如何处理

(顺便说一句,我不知道支持持久性的虚拟化引擎,也不知道是否有不支持持久性的虚拟化引擎。我想的是一般的理论领域。

如果我发明了虚拟化引擎的持久性(难以置信),我将其称为现有技术。;-)

一旦消耗内存的进程被终止,所有内存都会被释放。没有任何东西会被永久消耗。任何现代操作系统都会在进程退出后从进程中回收所有内存,因此内存泄漏只是进程执行过程中的一个问题。哦,好的,谢谢。因此,我正确地认为,当我关闭虚拟操作系统时,它会返回所有内存,而且当我稍后重新启动它时,它没有上一个会话中的任何阻塞内存,对吗?@SamC基本上是的。尝试看看最坏的情况,或者你如何得到你担心的东西:如果你的虚拟操作系统(可能还有虚拟机引擎)支持持久性(包括正在运行的进程及其内存)。在关闭前恢复情况后,可能会出现相同的内存问题。即“关闭”,含义为“hobernate”。否则,我同意其他评论。但是请注意,如果您泄漏共享内存,您可能会有“持续”(=直到下次重新启动)泄漏。这是真的,所有人都将其添加到答案中,但是OP的问题表明永久性损坏无法修复,并分配共享内存(不释放它)当然更糟糕,但正如您所提到的,重新启动仍然可以解决问题,因此我认为这些情况是最坏的情况。如果内存不足,操作系统将开始将驱动器用作内存(HDD、SSD),这将大大降低速度,在这一阶段,如果您