【问题标题】:Should I free allocated memory when I exit?我应该在退出时释放分配的内存吗?
【发布时间】:2018-08-29 17:06:09
【问题描述】:

我正在编写一个 c 终端程序,该程序一直运行到用户使用 Ctrl+C 终止它。想想pingtop

我的程序分配给堆,但没有启动其他线程或进程。我应该在退出前处理 SIGINT 并释放任何分配的内存还是将其留给操作系统更好的做法?

【问题讨论】:

  • 一旦您的程序退出,它分配的任何内存都会返回给操作系统,但最好自己释放分配的内存。
  • 您需要所有分配的内存指针都是全局的,以便处理程序能够free 它们,这是糟糕的程序设计。在正常流程中,您需要谨慎地将任何freed 指针设置为NULL - 以及如果在程序的正常过程中发生在freeing 内存之间的信号阻塞问题,并将其指针设置为NULL
  • 我不一定要释放处理程序中的内存,例如,可以在处理程序中设置一个标志来停止主循环并在循环退出后释放内存。但是,是的,为了获得可疑的收益,这将是相当大的努力,因此是这个问题。

标签: c terminal


【解决方案1】:

鉴于您的上下文,简短的回答是肯定的,这是正常的退出情况。在异常退出的情况下,简短的回答是绝对不会。

如果您担心程序在执行过程中会泄漏内存,这是一件坏事,因为它会减慢程序的执行速度,那么您可以跟踪分配的内存,然后在退出之前释放它.然后你可以用 valgrind 运行你的程序,如果 valgrind 抱怨没有释放的块,那么你就会知道你有某种类型的泄漏。分配的位置将帮助您了解泄漏是否重要。

【讨论】:

  • 抱歉,这根本不能回答问题。
  • @jayjay 这可能是因为我在写“如果你是……”的时候表现得很被动。您应该担心,证明您没有泄漏的简单方法是在您正常退出(您的上下文)时释放您的可用内存并让 valgrind 完成艰苦的工作。
  • @jayjay Odd,在您的“停止主循环”评论中,您所说的正是我所规定的。然后当 valgrind 获得控制权时,它会说出哪些内存块是 lost 以及这些块被分配到哪里。这是一件美好的事情。
  • 我对 Valgrind 根本不感兴趣。它是一个很棒的工具,但不是这个问题的重点。事实上,问题中的任何地方都没有提到,或者我的任何 cmets。
  • @jayjay 没错,您没有提到 valgrind,但您确实提到了释放内存并证明您正在释放所有内存需要一个“好工具”。
【解决方案2】:

如果你还是退出了,你不需要释放任何资源。操作系统会很好地处理它,手动操作没有任何好处。

请注意,free() 不是async-safe,因此您肯定必须在主线程中进行实际释放,而不是在处理程序中。但不要那样做,除非你想做exit()以外的其他事情。

将 SIGINT 处理程序用于重置终端(例如使用 ncurses)或保存关键状态。

【讨论】:

  • 资源应该总是被释放,即使操作系统可以自动回收它们。在不释放其资源的程序上运行 valgrind 可能会产生误报,并使跟踪生产中的错误变得更加困难。
  • 我认为在 SIGINT 之后没有必要让 valgrind 提供准确的报告,但您的要求可能会有所不同。
  • 并非所有资源都是平等的...如果您打开一个文件进行写入并且没有正确关闭它 - 它会被截断。这只是用于说明目的的一个示例
  • exit() 将刷新 IO 流的缓冲区。虽然还有其他示例(锁定/pid 文件、信号量、命名管道),但在原始问题中都没有提到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2011-08-02
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多