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 而被核心转储。
你能说出有什么区别吗?
SIGABRT由删除的实现显式检测并发出信号,该删除的实现检测到第二次删除的无效性。通过调用abort函数来启动
SIGSEGV 是不同的,它正在经历而不是像以前那样通过库中的检查来检测,它是通过操作系统的内存管理启动的
请参阅https://en.cppreference.com/w/c/program/SIG_types
| 归档时间: |
|
| 查看次数: |
7435 次 |
| 最近记录: |