返回std::string的函数返回零
Function returning std::string returns zero
在维护大型遗留代码库时,我遇到了这个函数,它可以作为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>
,它正好描述了这一点
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数