【问题】atoi函数传空报段错误,核心已转储,xml获取空节点引发的惨案

最近在搬砖过程中遇到编译器报段错误,感觉有必要记录一下。

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空间不足,数组定义长度不够等内存分配失败

后期有想到再添加,大家也可以提供一起看下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值