我用以上两段代码做了核心转储错误:
//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