C 内存泄漏的现实危险?

Real-World Dangers of C Memory Leaks?

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

以下是否会对我的系统产生长期影响?谢谢。

根据评论中的回答:

  • 如果系统重新启动,内存泄漏应该会消失
  • 宇宙飞船很难重启
  • 如果写入正确,VM 是安全的

感谢您的快速回答!

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

如果您的产品以某种方式控制硬件,您需要非常小心。如果软件出现故障,那么您将不知道硬件可能会做什么。就像其中一个评论说的那样,一艘飞船出现内存泄漏导致坠毁,可以让飞船坠毁。机器人可能会意外移动并造成 属性 损坏或人身伤害。其他设备可能会导致放电。

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

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

内存泄漏不会损坏您的机器。当一个程序终止时,它的所有临时资源都被释放,包括分配给它的任何内存。

受影响的是你的编程风格。正确释放资源并不困难,但需要一些练习。一段时间后,您将需要更少的思考才能做到这一点。这就是让你成为一名优秀程序员的原因之一。

为什么重要?因为迟早,您将开始编写 运行 很长一段时间的程序,可能是信息服务器、Web 浏览器或图形编辑器。保持活动状态直到用户不再需要它,或者因为它在用完所有可用内存后崩溃。而你不想为第二个结果负责。

所以现在,当你开始的时候,是时候养成一些好习惯了。学会正确的做法,以后就不用再学了。