问题
在自己的C++项目中接口参数是XML类型的,所以使用了tinyxml2
这个开源XML库,但是写好的动态库给别人调用时程序却闪退了,用日志里的参数试了一次,还真的会造成sigsegv segv_mapper
错误,这个错误常见于空指针。
但是自己明明对每个节点都进行了判空操作,怎么还会出现空指针呢?
XML示例如下
<ParamContext>
<Version>1.0</Version>
<Data>
<KeyItem>
<Type>1</Type>
<Identifier/>
</KeyItem>
</Data>
</ParamContext>
C++ 解析部分
const auto RootEle = doc.FirstChildElement("ParamContext");
if (RootEle == nullptr)
return -1;
const auto Version = RootEle->FirstChildElement("Version");
if (Version == nullptr)
return -1;
std::string version = Version->GetText();
const auto Data = RootEle->FirstChildElement("Data");
if (Data == nullptr)
return -1;
const auto KeyItem = Data->FirstChildElement("KeyItem");
if (KeyItem == nullptr)
return -1;
const auto Type = KeyItem->FirstChildElement("Type");
if (Type == nullptr)
return -1;
type = Type->IntText();
Identifier= KeyItem->FirstChildElement("Identifier");
if (Identifier == nullptr)
return -1;
std::string identifier = Identifier->GetText();
原因
排查问题的时候怎么看都觉得自己的代码没有一点问题,最后试着打印日志发现了问题
if (Identifier->GetText() == nullptr) {
LOGFMTI("Identifier为空");
}
上面那行日志输出了,所以问题就在于if (Identifier == nullptr)
只能判断这个XML标签存在,但是不能判断里面的内容是否为空,
传进来的参数<Identifier/>
这个标签的内容是空的,调用GetText()
方法得到结果也是空的.
在赋值前还需对GetText()
方法返回的内容做判空操作才行!