C内存泄漏的现实危险?

C内存泄漏的现实危险?,c,gcc,memory-leaks,virtual-machine,hardware,C,Gcc,Memory Leaks,Virtual Machine,Hardware,我正在学习C语言,并且担心内存泄漏。我知道重新启动通常会刷新内存,假设我不再运行该程序,我会没事的。我正在考虑使用第二台大功率机器。如果出现以下情况,我的系统会有多糟糕: 我做了一些可笑的蠢事 我使用GCC(不确定编译器是否可以做任何事情?) 我有内存泄漏并重新启动 出于好奇,如果我使用虚拟机。我可能不会,因为我更喜欢使用真正的硬件 以下任何事情会对我的系统产生长期影响吗?谢谢。根据评论中的答案: 如果系统重新启动,内存泄漏应该消失 宇宙飞船很难重新启动 如果正确写入虚拟机,则它们是安全的

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

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

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

根据评论中的答案:

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

谢谢你的快速回答

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

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

至于处理内存泄漏,你只需要小心。在C语言中,对
malloc
和类似函数的任何调用都需要与对all执行路径上的
free
的调用配对。如果发生某种类型的错误,如果应用程序要继续运行,仍然需要调用
free
。同样,
fopen
应该与
fclose
配对。在这里,您还可能遇到文件句柄不足的问题,这在许多方面是一个不同但类似的问题。在C++中,使用<代码>新< /COD>的手动内存分配应该与 Dele>代码>配对,尽管使用“智能”指针如 STD::UngQuyPPT,<代码> STD::SysDypPTR ,和可以减轻内存管理,防止内存泄漏。其他库还提供指针类型,这些指针类型使用引用计数来处理自己的生命周期。我建议您在任何时候都可以使用这些原始指针。如果你有选择使用C++而不是C,我也会建议。在大多数情况下(性能或其他),您不需要C++上的C。如果你不确定你需要C,你可以使用C++ +<
如果您对查找内存泄漏感兴趣,请查看。它有很多功能可以帮助您查找内存泄漏并确定其严重性。

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

你的编程风格会受到影响。正确地释放资源并不困难,但需要一些实践。过了一段时间,你将需要想得更少,以便做到这一点。这是使你成为一名优秀程序员的因素之一

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


所以现在,当你开始的时候,是培养一些好习惯的时候了。学习如何正确操作,以后就不必重新学习了。

运行这种代码的宇宙飞船可能会砸到你的房子。如果我在编写企业软件,希望我不会犯这样的错误:)一旦进程退出,内存泄漏就会消失。如果我在Windows上运行代码,BSoD会怎么样?如果VM编写正确,它上发生的任何事情都不会影响主机。您可以在不进行动态内存分配的情况下编写代码。此代码不会有内存泄漏。这种制度用于安全关键领域systems@EdHeal也有很好的一点。避免动态内存分配是避免内存泄漏的可靠方法。它还将阻止您因动态内存分配而出现运行时错误。对于那些习惯于看到人们在C和C++中到处使用原始指针的人来说,有很多地方可以避免动态内存分配。