最近在搬砖过程中遇到编译器报段错误,感觉有必要记录一下。
1、起因
程序编译无错,在debug时,程序突然中断报段错误,核心已转储。
1.1 段错误,核心已转储
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)。产生段错误的原因大致上有三类:访问不存在的内存地址、访问系统保护的内存地址和访问只读的内存地址。
1.2 原因
定位错误,发现是在转值操作atoi操作过程中传递了个NULL。这个问题如果没有 core真的是很难受,因为很难被发现。再往上查这个空指针哪里来的,于是,我们发现了
int nPranDate=0;
TiXmlElement* pRefer = pAction->FirstChildElement("ReferValue");
if (pRefer != NULL)
{
nPranDate = atoi(pRefer->GetText());
}
atoi(pRefer->GetText())
正常情况下是OK的,可以别人发送的xml ReferValue节点是这样的
<ReferValue> </ReferValue>
pRefer->GetText()结果是啥 ? 是空啊。。
2、解决方案
int nPranDate=0;
TiXmlElement* pRefer = pAction->FirstChildElement("ReferValue");
if (pRefer != NULL)
{
if (pRefer->GetText() != NULL)
nPranDate = atoi(pRefer->GetText());
}
OK了
3、总结(几种异常及处理)
异常 | 引发 |
---|---|
段错误,核心已转储 | atol,atoi,atof等不允许输入NULL, |
内存不足 | malloc,new空间不足,数组定义长度不够等内存分配失败 |
后期有想到再添加,大家也可以提供一起看下。