C 内存泄漏的现实危险?
Real-World Dangers of C Memory Leaks?
我正在学习C,并且担心内存泄漏。我知道重新启动通常会刷新内存,假设我不再 运行 该程序,我会没事的。我正在考虑使用第二台大功率机器。如果出现以下情况,我能把系统搞砸到什么程度:
- 我做了一件可笑的蠢事
- 我使用 GCC(不确定编译器是否可以做任何事情?)
- 我有内存泄漏并重新启动
- 出于好奇,如果我使用虚拟机。我可能不会,因为我只是更喜欢使用真正的硬件。
以下是否会对我的系统产生长期影响?谢谢。
根据评论中的回答:
- 如果系统重新启动,内存泄漏应该会消失
宇宙飞船很难重启
- 如果写入正确,VM 是安全的
感谢您的快速回答!
如果你的产品是纯软件,你最需要担心的是内存泄漏,最终导致机器 运行 内存不足,无法再分配,并且应用程序将崩溃。很多记忆不会重复发生,甚至不会走到这一步。当应用程序退出时,它们将消失。如果在崩溃时修改了某些内容,您的应用程序也可能会损坏数据,但这可能适用于任何类型的崩溃。
如果您的产品以某种方式控制硬件,您需要非常小心。如果软件出现故障,那么您将不知道硬件可能会做什么。就像其中一个评论说的那样,一艘飞船出现内存泄漏导致坠毁,可以让飞船坠毁。机器人可能会意外移动并造成 属性 损坏或人身伤害。其他设备可能会导致放电。
就处理内存泄漏而言,您必须小心。在 C 中,对 malloc
和类似函数的任何调用都需要与 所有 执行路径上对 free
的调用配对。如果发生某种类型的错误,如果应用程序要继续 运行ning,仍然需要调用 free
。同样,fopen
应与 fclose
配对。在这里,您还可以 运行 解决 运行 文件句柄不足的问题,这是一个不同但在许多方面相似的问题。在 C++ 中,使用 new
的手动内存分配应该与 delete
配对,尽管使用 "smart" 指针,如 std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
可以简化内存管理并防止内存泄漏。其他库也提供了使用引用计数来处理自己的生命周期的指针类型。我建议您在任何时候都可以使用这些而不是原始指针。如果您可以选择使用 C++ 而不是 C,我也建议您这样做。在大多数情况下(性能或其他),您实际上不需要 C 而不是 C++。如果您不确定是否需要 C,您可以使用 C++。
如果您有兴趣查找内存泄漏,请查看 valgrind。它有很多功能可以帮助您发现内存泄漏并确定其严重性。
内存泄漏不会损坏您的机器。当一个程序终止时,它的所有临时资源都被释放,包括分配给它的任何内存。
受影响的是你的编程风格。正确释放资源并不困难,但需要一些练习。一段时间后,您将需要更少的思考才能做到这一点。这就是让你成为一名优秀程序员的原因之一。
为什么重要?因为迟早,您将开始编写 运行 很长一段时间的程序,可能是信息服务器、Web 浏览器或图形编辑器。保持活动状态直到用户不再需要它,或者因为它在用完所有可用内存后崩溃。而你不想为第二个结果负责。
所以现在,当你开始的时候,是时候养成一些好习惯了。学会正确的做法,以后就不用再学了。
我正在学习C,并且担心内存泄漏。我知道重新启动通常会刷新内存,假设我不再 运行 该程序,我会没事的。我正在考虑使用第二台大功率机器。如果出现以下情况,我能把系统搞砸到什么程度:
- 我做了一件可笑的蠢事
- 我使用 GCC(不确定编译器是否可以做任何事情?)
- 我有内存泄漏并重新启动
- 出于好奇,如果我使用虚拟机。我可能不会,因为我只是更喜欢使用真正的硬件。
以下是否会对我的系统产生长期影响?谢谢。
根据评论中的回答:
- 如果系统重新启动,内存泄漏应该会消失
宇宙飞船很难重启- 如果写入正确,VM 是安全的
感谢您的快速回答!
如果你的产品是纯软件,你最需要担心的是内存泄漏,最终导致机器 运行 内存不足,无法再分配,并且应用程序将崩溃。很多记忆不会重复发生,甚至不会走到这一步。当应用程序退出时,它们将消失。如果在崩溃时修改了某些内容,您的应用程序也可能会损坏数据,但这可能适用于任何类型的崩溃。
如果您的产品以某种方式控制硬件,您需要非常小心。如果软件出现故障,那么您将不知道硬件可能会做什么。就像其中一个评论说的那样,一艘飞船出现内存泄漏导致坠毁,可以让飞船坠毁。机器人可能会意外移动并造成 属性 损坏或人身伤害。其他设备可能会导致放电。
就处理内存泄漏而言,您必须小心。在 C 中,对 malloc
和类似函数的任何调用都需要与 所有 执行路径上对 free
的调用配对。如果发生某种类型的错误,如果应用程序要继续 运行ning,仍然需要调用 free
。同样,fopen
应与 fclose
配对。在这里,您还可以 运行 解决 运行 文件句柄不足的问题,这是一个不同但在许多方面相似的问题。在 C++ 中,使用 new
的手动内存分配应该与 delete
配对,尽管使用 "smart" 指针,如 std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
可以简化内存管理并防止内存泄漏。其他库也提供了使用引用计数来处理自己的生命周期的指针类型。我建议您在任何时候都可以使用这些而不是原始指针。如果您可以选择使用 C++ 而不是 C,我也建议您这样做。在大多数情况下(性能或其他),您实际上不需要 C 而不是 C++。如果您不确定是否需要 C,您可以使用 C++。
如果您有兴趣查找内存泄漏,请查看 valgrind。它有很多功能可以帮助您发现内存泄漏并确定其严重性。
内存泄漏不会损坏您的机器。当一个程序终止时,它的所有临时资源都被释放,包括分配给它的任何内存。
受影响的是你的编程风格。正确释放资源并不困难,但需要一些练习。一段时间后,您将需要更少的思考才能做到这一点。这就是让你成为一名优秀程序员的原因之一。
为什么重要?因为迟早,您将开始编写 运行 很长一段时间的程序,可能是信息服务器、Web 浏览器或图形编辑器。保持活动状态直到用户不再需要它,或者因为它在用完所有可用内存后崩溃。而你不想为第二个结果负责。
所以现在,当你开始的时候,是时候养成一些好习惯了。学会正确的做法,以后就不用再学了。