返回std :: string的函数返回零

时间:2018-07-22 09:16:42

标签: c++

在维护大型遗留代码库时,我遇到了此功能,该功能用作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()

可能很幸运,它从未返回零(或者如果没有,则直到现在还没有人发现该错误)。

2 个答案:

答案 0 :(得分:4)

您关于“ char*为零指针”的直觉是正确的。发生的事情是,0被解释为空指针,导致从const char*空指针初始化返回的字符串。

但是,这是C ++中未定义的行为。 std::string(const char*)构造函数需要一个指向以Null结尾的字符串的指针。因此,您发现了一个错误。该修复程序确实取决于功能的要求,但我抛出异常将是对未定义行为 * 的一种改进。


*这是一个很大的轻描淡写。代码不应具有未定义的行为

答案 1 :(得分:1)

这取决于您要如何发信号通知没有数据。如果没有数据意味着xml树中有一个空字符串值,则只需返回一个空字符串。

如果您要建模,例如没有数据项,因此树中没有数据,根据数据语义,您可以有几种选择。

  • 如果数据是强制性的并且必须存在,则您的对象具有不变的违规对象,即处于非法状态的对象。将该对象用于任何事物都是非法的。我要么std::terminate程序(或使用其他合适的终止机制,例如错误报告程序),要么抛出保证不会被捕获和处理的东西。
  • 如果数据是可选的,则可以返回对此建模的内容。在C语言中,您可能会使用指向可以为null的对象的指针,但这会带来所有权问题。在C ++中,您可以返回一个std::optional<std::string>来准确描述这一点。