C内存泄漏的现实危险?

时间:2017-04-20 22:05:03

标签: c gcc memory-leaks virtual-machine hardware

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

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

以下任何一项都会对我的系统产生长期影响吗?感谢。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

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

你的编程风格会受到什么影响。正确地释放资源并不困难,但需要一些练习。过了一会儿,你需要少考虑才能做到这一点。这是让你成为优秀程序员的事情之一。

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

所以现在,当你开始时,是时候养成一些好习惯了。了解如何正确行事,您不必在以后重新学习。

答案 2 :(得分:1)

根据评论中的答案:

  • 如果系统重新启动,内存泄漏应该消失
  • 太空船难以重启
  • 如果正确写入,则VM是安全的

感谢您的快速解答!