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 上释放内存的方法是否有意义,或者是否有更好的方法。
您的代码存在严重缺陷(除了毫无意义之外)。
malloc
和 free
不是异步信号安全的。从信号处理程序调用它们会调用未定义的行为,并且您的程序可能会随机崩溃。
最后,您的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 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )