SIGABRT 和 SIGSEGV 有什么区别

Yve*_*ves 7 c c++ linux coredump signals

我用下面的两段代码犯了核心转储错误:

//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;
}
Run Code Online (Sandbox Code Playgroud)

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

你能说出有什么区别吗?

bru*_*uno 5

SIGABRT由删除的实现显式检测并发出信号,该删除的实现检测到第二次删除的无效性。通过调用abort函数来启动

SIGSEGV 是不同的,它正在经历而不是像以前那样通过库中的检查来检测,它是通过操作系统的内存管理启动的

请参阅https://en.cppreference.com/w/c/program/SIG_types