在C++中多次处理分段故障
Handle segmentation fault multiple times in C++
我可以处理一次分段故障。但当它再次发生时,会导致分割错误。是否可以多次处理sigsegov信号?
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
int *a;
class FoobarException
{
int thingy;
};
void signal_handler(int signum, siginfo_t *info, void *)
{
printf("signal_handlern");
FoobarException *f = new FoobarException;
throw f;
}
void call(int * c)
{
struct sigaction act;
act.sa_sigaction = signal_handler;
sigemptyset (&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction (11, &act, NULL);
try
{
printf("%dn", *a);
}
catch (FoobarException *f)
{
printf("Hello!n");
}
}
int main()
{
int *b;
call(b);
printf("I am here.n");
call(a);
}
第一个call(b)
处理seg故障,但第二个call(a)
引发seg故障。
一旦出现Segmentation错误,并且处理了异常,但没有恢复原因。打赌是为了避免seg故障。在您的示例程序中,您有指针a
、b
,但没有分配,因此a
、b
包含垃圾(未分配),因此访问*a
是有风险的,会导致seg错误。
相反,为a
、b
(例如)分配足够的空间
a = (int *) malloc(sizeof (int));
类似地,对于b
。
不要忘记在完成时解除分配,比如
free(a);
您不能使用C++try/catch块来处理信号,因为POSIX的信号常不同。例如,信号是异步的,由内核触发,而C++异常则是同步的:
在编写处理程序函数时需要特别小心,因为它们可以异步调用。也就是说,可能会调用一个处理程序在程序的任何时候,都是不可预测的。如果有两个信号到达在很短的时间间隔内,一个处理程序可以在另一个内运行。
您可以在这里找到关于如何编写正确的信号处理程序的更多信息。看看volatile sig_atomic_t
相关文章:
- 警告处理为错误这里有什么问题
- 分段故障(堆芯转储)矢量
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 具有shared_ptr的处理程序中的分段错误
- 输入处理程序函数中的分段错误
- 处理矩阵(数组)的分段错误错误
- c++中数据文件处理中的分段错误
- 处理从 QProcess 运行的程序中的分段错误
- 如何处理数组C++中的分段错误
- 处理指针c++的分段错误(这次有更多代码)
- 如何处理堆栈外空间分段错误
- 处理文件时出现奇怪的分段错误
- C++处理文本文件中的分段故障11
- 在C++中多次处理分段故障
- c++中的异常处理从来没有捕捉到基本类型的异常,总是导致分段错误
- C++中的分段错误是否可以像在 Java 中处理 NullPointerExceptions 一样处理
- 递归n皇后程序中c++分段错误的处理
- 处理连接对象时出现分段错误