c – SIGABRT和SIGSEGV有什么区别

我用以上两段代码做了核心转储错误:

//test.cpp
int main()
{
    int *p = new int;
    *p = 100;
    delete p;
    delete p;
    return 0;
}

//test2.cpp
int main()
{
    int *p = new int;
    *p = 100;
    delete p;
    *p = 111;
    std::cout<<*p<<std::endl;
    return 0;
}

Gdb告诉我,由于信号SIGABRT,第一段代码被核心转储,而第二段代码由于信号SIGSEGV而被核心转储.

你能说出有什么区别吗?

解决方法:

通过执行删除检测到第二次删除无效,显式检测到SIGABRT并发出信号.它是通过调用中止函数来启动的

SIGSEGV是不同的,它正在进行而不是通过像以前那样检查库中的检测,它是通过OS的内存管理启动的

https://en.cppreference.com/w/c/program/SIG_types

上一篇:如何从已停止的程序(linux)获取核心转储


下一篇:c – Perl系统调用导致核心转储但是$?保持为零