C 内存泄漏的真实世界危险?

2 c hardware gcc memory-leaks virtual-machine

我正在学习 C,并且担心内存泄漏。我知道重启通常会刷新内存,假设我不再运行该程序,我会没事的。我正在考虑使用第二台大功率机器。如果出现以下情况,我会搞砸我的系统有多严重:

  • 我做了一些可笑的蠢事
  • 我使用 GCC(不确定编译器是否可以做任何事情?)
  • 我有内存泄漏并重新启动
  • 出于好奇,如果我使用虚拟机。我可能不会,因为我只是更喜欢使用真正的硬件。

以下任何事情会对我的系统产生长期影响吗?谢谢。

dan*_*ood 5

如果你的产品是纯软件,你最需要担心的就是内存泄漏,最终导致机器内存不足,无法再分配,应用程序将崩溃。很多记忆不会重复发生,甚至不会走到这一步。当应用程序退出时,它们将消失。如果在崩溃时修改了某些内容,您的应用程序也可能会损坏数据,但这可能适用于任何类型的崩溃。

如果您的产品以某种方式控制硬件,则需要非常小心。如果软件失败,那么您不知道硬件可能会做什么。正如其中一条评论所说,存在内存泄漏导致坠毁的宇宙飞船可能会导致宇宙飞船坠毁。机器人可能会意外移动并造成财产损失或人员伤害。其他设备可能会导致放电。

至于处理内存泄漏,你只需要小心。在 C 中,任何对malloc和类似函数的调用需要与所有执行路径free上的调用配对。如果发生某种类型的错误,如果应用程序要继续运行,仍然需要调用。同样,应该与. 在这里,您还可能遇到文件句柄用完的问题,这是一个不同但在许多方面相似的问题。在 C++ 中,手动内存分配应该与 配对,尽管使用“智能”指针,如,freefopenfclosenewdeletestd::unique_ptrstd::shared_ptrstd::weak_ptr可以简化内存管理并防止内存泄漏。其他库也提供使用引用计数来处理自己生命周期的指针类型。我建议您在任何时候都可以使用这些原始指针。如果您可以选择使用 C++ 而不是 C,我也建议您这样做。在大多数情况下(性能或其他),您实际上并不需要 C 而不是 C++。如果您不确定是否需要 C,则可以使用 C++。

如果您对查找内存泄漏感兴趣,请查看valgrind。它有很多功能可以帮助您找到内存泄漏并确定其严重性。