2011-12-31 219 views
1

我想删除一个已经删除的对象,我得到一个SIGABRT信号。 我知道这个信号中止我的程序,但我想在信号处理程序中捕获此信号,并显示消息,我正在删除一个已删除的对象...如何编写sigabrt信号的信号处理程序?

这是我试过的代码,但它doesn似乎没有用。 请帮我弄清楚它有什么问题吗?

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); 
} 
+0

你是什么意思“似乎没有工作”? (在这里工作正常,请尝试格式化你的代码) – Mat 2011-12-31 20:14:00

+0

它只是中止没有给我的味精“试图删除未分配的内存,退出......” – haris 2011-12-31 20:15:55

+0

我看到消息打印罚款(克++ 4.6.1/ubuntu 11 x86)如果这是你如何定义“作品”。 – hmjd 2011-12-31 20:17:37

回答

2

C标准说(部分7.14,两者C99C11的第4段):

的实现不需要生成任何这些信号的,除非显式 呼叫到的结果提升功能。

C++标准没有给出额外的附加保证。

POSIX说:

中止()函数将导致出现不正常的进程终止,除非信号SIGABRT被捕获,并且信号处理函数没有返回。

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

SIGABRT信号应该发送到调用进程,就像通过提高()一样使用参数SIGABRT。

提供给状态等待()或waitpid函数()由中止()应是由SIGABRT信号终止的进程的。 中止()函数应覆盖阻塞或忽略SIGABRT信号。

所以,是的,你有希望看到一个SIGABRT完全没有依据;你很幸运,你没有遇到nasal demons