首页 > 解决方案 > 返回 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()

可能只是幸运它从未返回零(或者如果确实如此,直到现在没有人发现这个错误)。

标签: c++

解决方案


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

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


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


推荐阅读