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

Function returning std::string returns zero

本文关键字:返回 函数 string std      更新时间:2023-10-16

在维护大型遗留代码库时,我遇到了这个函数,它可以作为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 *,表示未找到任何数据,但在带有std::string的C++中,这可能吗?我不这么认为,但对C++还不够了解。

这段(已有10年历史(代码是在C++98下编译和运行的。

编辑I

感谢大家的评论。回答几个问题:

a( 代码实际上已经有18年的历史了,大约有500K-1M行(?(

b( 异常处理已启用,但除了main()中的几个块外,任何位置都没有try-catch块,这将导致程序立即终止。

c( 调用代码的设计很差,似乎"信任"getStringValue()返回正确的值,所以有很多类似的东西:

std::string s = pTheNode->getStringValue()

可能只是幸运的是,它从未返回零(或者如果返回了,直到现在还没有人发现错误(。

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

然而,这是C++中未定义的行为。std::string(const char*)构造函数需要指向以null结尾的字符串的指针。所以你发现了一个bug。修复实际上取决于函数的要求,但我抛出一个异常将是对未定义行为*的改进。


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

这取决于您希望如何发出没有数据的信号。如果没有数据意味着xml树中有一个空字符串值,则可以只返回一个空的字符串。

如果你想建模,例如树中没有数据项,因此没有数据,你有几个选项,这取决于你的数据语义。

  • 如果数据是强制性的并且应该存在,则您有一个具有违反不变量的对象,即处于非法状态的对象。使用该对象进行任何操作都是非法的。我要么std::terminate程序(或者使用其他合适的终止机制,例如错误报告器(,要么抛出保证不会被捕获和处理的东西
  • 如果数据是可选的,您可以返回一些对此进行建模的内容。在C中,您可能会使用一个指向可以为null的对象的指针,但这会引入所有权问题。在C++中,您可以返回一个std::optional<std::string>,它正好描述了这一点