如何为sigabrt信号写信号处理程序?

时间:2011-12-31 20:09:56

标签: c++ signals

我正在尝试删除已删除的对象,并且我收到SIGABRT信号。 我知道这个信号会中止我的程序,但我想在信号处理程序中捕获此信号并显示我正在删除已删除对象的消息...

这是我尝试过的代码,但它似乎不起作用。 请帮我弄清楚它有什么问题?

using namespace std;

class myclass
{
public:
   myclass()  { cout <<"myclass constructed\n"; }
   ~myclass() { cout <<"myclass destroyed\n"; }
};

void func(int);

int main (void)
{
  signal(SIGABRT,func);
  myclass * pt;

  pt = new myclass[3];

  delete[] pt;
  delete[] pt;

  return 0;
}

void func(int)
{ 
   signal(SIGABRT,func);
   cout << "trying to delete unallocated memory, exiting....\n";
   exit(0);
}

1 个答案:

答案 0 :(得分:2)

C标准说(C99C11的第7.14段第4段):

  

实现不需要生成任何这些信号,除非是显式的结果   调用raise函数。

C ++标准不提供任何额外的保证。

POSIX说:

  

abort ()函数将导致异常进程终止,除非信号SIGABRT被捕获且信号处理程序没有返回。

     

异常终止处理应包括为SIGABRT定义的默认操作,并可能包括尝试在所有打开的流上生成fclose()。

     

SIGABRT信号应该通过带有参数SIGABRT的 raise ()发送到调用进程。

     

等待()或 waitpid () abort ()可用的状态应为SIGABRT终止的进程的状态信号。 abort ()函数将覆盖阻塞或忽略SIGABRT信号。

所以,是的,你根本没有希望看到SIGABRT的基础;你很幸运,你没有遇到nasal demons