在维护大型遗留代码库时,我遇到了此功能,该功能用作XML树的访问器。
std::string DvCfgNode::getStringValue() const
{
xmlChar *val = xmlNodeGetContent(mpNode);
if (val == 0)
return 0;
std::string value = (const char *)val;
xmlFree(val);
return value;
}
此函数如何返回“ 0”?在C语言中,您可以返回零指针作为char *
,指示未找到数据,但是在C ++中使用std :: string可能吗?我不这么认为,但对C ++不够了解。
(已有10年的历史了)代码编译并在C ++ 98下运行。
编辑我
感谢大家的评论。要回答几个问题:
a)代码实际上已经使用了18年,大约有500K-1M行(?)
b)异常处理已打开,但除try-catch
中的几个块之外,没有main()
个块,这会导致程序立即终止。
c)调用代码中的设计欠佳,似乎“信任” getStringValue()
不能返回正确的值,所以很多事情如下:
std::string s = pTheNode->getStringValue()
可能很幸运,它从未返回零(或者如果没有,则直到现在还没有人发现该错误)。
答案 0 :(得分:4)
您关于“ char*
为零指针”的直觉是正确的。发生的事情是,0
被解释为空指针,导致从const char*
空指针初始化返回的字符串。
但是,这是C ++中未定义的行为。 std::string(const char*)
构造函数需要一个指向以Null结尾的字符串的指针。因此,您发现了一个错误。该修复程序确实取决于功能的要求,但我抛出异常将是对未定义行为 * 的一种改进。
*这是一个很大的轻描淡写。代码不应具有未定义的行为
答案 1 :(得分:1)
这取决于您要如何发信号通知没有数据。如果没有数据意味着xml树中有一个空字符串值,则只需返回一个空字符串。
如果您要建模,例如没有数据项,因此树中没有数据,根据数据语义,您可以有几种选择。
std::terminate
程序(或使用其他合适的终止机制,例如错误报告程序),要么抛出保证不会被捕获和处理的东西。std::optional<std::string>
来准确描述这一点。