C - 在 SIGINT 上释放分配的内存

Posted

技术标签:

【中文标题】C - 在 SIGINT 上释放分配的内存【英文标题】:C - Free allocated memory on SIGINT 【发布时间】:2022-01-05 06:33:44 【问题描述】:

我想编写一个程序,它将用 0 填充计算机的内存,直到 malloc() 失败。但是,我不确定使用 Ctrl+C 杀死程序是否会释放此内存。我添加了一些信号处理代码,这样当程序收到SIGINT时,分配的内存被释放,程序被杀死。

我的代码似乎可以工作,但我想知道这种在SIGINT 上释放内存的方法是否有意义,或者是否有更好的方法。

我的代码:

#include <stdlib.h>
#include <signal.h>

int *ptr;

void inthandler(int dummy)  /* what does this argument do? */
   extern int *ptr;
   free(ptr);
   exit(-1);


int main(void) 
   signal(SIGINT, inthandler);
   extern int *ptr;
   while ((ptr = malloc(sizeof *ptr)) != NULL) 
         *ptr = 0;
   

【问题讨论】:

sigaction() 将信号编号作为您的“虚拟”参数传递。 【参考方案1】:

但是,我不确定使用 Ctrl+C 终止程序是否会释放此内存。

在任何现代操作系统上都可以。

我的代码似乎可以工作,但我想知道这种在 SIGINT 上释放内存的方法是否有意义,或者是否有更好的方法。

您的代码存在严重缺陷(除了毫无意义之外)。

mallocfree 不是异步信号安全的。从信号处理程序调用它们会调用未定义的行为,并且您的程序可能会随机崩溃。

最后,您的inthandler() 永远不会被实际调用——您需要调用signal()sigaction() 才能将inthandler 实际设置为SIGINT 处理程序。

更新:

我在程序中添加了 signal() 调用。

就像我说的,这让程序更糟(因为在信号处理程序中调用free() 是不安全的)。

如果杀死程序释放了它的内存,为什么在程序完成使用它之后必须在分配的内存上调用free()?

正如 Chris Dodd 所评论的,在即将退出的程序中,永远不需要 free 内存——操作系统会自动执行此操作。

只需要free() 内存IFF 程序将继续运行并且 将来会分配更多内存。在这种情况下,如果程序没有 free() 它之前分配的内存,它最终会用完堆。

【讨论】:

我在程序中添加了 signal() 调用。另外,如果杀死程序释放了它的内存,为什么还要在程序使用完后在分配的内存上调用free()? @spitemim:如果程序即将退出,则永远不需要在分配的内存上调用 free()。您只需要在不再需要内存并且程序将继续运行时调用 free()。 @spitemim 我已经更新了答案。 感谢您提供的信息:)。因此,只有在不再使用时才需要释放()内存,并且程序将继续运行,并且永远不会在信号处理程序中。 @spitemim 没错。关于礼仪的一句话:如果答案对您有帮助,请点赞。如果它完全回答了您的问题,请接受它。

以上是关于C - 在 SIGINT 上释放分配的内存的主要内容,如果未能解决你的问题,请参考以下文章

在 C 和 C++ 中如何分配和释放 *array* 内存?

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

c语言分配内存方式都有哪些

在 C 中退出程序时释放所需的分配内存

在C语言进行编程中,为啥要释放旧内存?

C ++释放共享库中动态分配的内存导致崩溃