c++ - 返回 std::string 的函数返回零
问题描述
在维护一个大型遗留代码库时,我遇到了这个函数,它用作 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
除了几个 in 之外没有任何块main()
,这导致程序立即终止。
c)调用代码中的糟糕设计似乎“信任”getStringValue()
返回一个正确的值,所以很多类似的东西:
std::string s = pTheNode->getStringValue()
可能只是幸运它从未返回零(或者如果确实如此,直到现在没有人发现这个错误)。
解决方案
您对“零指针为char*
”的直觉是正确的。正在发生的事情是0
被解释为空指针,导致返回的字符串从const char*
空指针初始化。
但是,这是 C++ 中未定义的行为。std::string(const char*)
构造函数需要一个指向以 null 结尾的字符串的指针。所以你发现了一个错误。修复确实取决于函数的要求,但我抛出异常将是对未定义行为*的改进。
* 这是一个严重的轻描淡写。代码不应有未定义的行为
推荐阅读
- c++ - 多客户端 TCP 服务器 C++ 问题
- api - 如何使用 NuSOAP 工具包在 SOAP 请求中设置请求标头
- c# - 在 hololens 中从我们的应用程序启动应用程序
- linux - 从 Nginx 版本信息中提取某些行
- mysql - Wamp服务器需要我手动启动mysqld.exe
- node.js - 部署 Angular 9 SSR 应用程序以触发基地的问题
- c++ - 如何用mod包裹-pi和pi之间的弧度?
- ansible - 当没有主机匹配时失败而不是警告
- google-sheets - 如何在 Google 表格上乱序转置
- android - 在 Fragment 中点击 OptionsMenu 项时不需要的导航