kdo*_*dog 7 c++ string std null-pointer
我最近向std::string
构造函数传递了一个空指针并得到了未定义的行为。我敢肯定,这是在我之前成千上万的程序员所做的事情,同样的错误无疑已经导致无数程序崩溃。使用代码转换时谈到了很多char*
使用代码std::string
,它的那种东西,是不是在编译时开捕,并可以很容易地在运行时的单元测试错过。
我感到困惑的是指定std::string
这种方式的原因。
为什么不直接定义std::string(NULL)==""
?
效率损失可以忽略不计,我怀疑它在实际程序中甚至可以测量。
有谁知道std::string(NULL)
未定义的可能原因是什么?
据我所知,没有充分的理由。
std::string
不是做得好的标准化的最好例子。最初标准化的版本无法实施;对其提出的要求彼此不一致。
在某些时候,这种不一致被修复了。
在c++11 中,规则发生了变化,阻止了 COW(写时复制)实现,这破坏了现有合理兼容std::string
的ABI 。这个变化可能是解决不一致的地方,我不记得了。
它的 API 与其他的不同 std
与 容器因为它不是来自同一个前std
STL。
处理这种遗留行为 std::string
视为某种考虑到性能成本的合理决策是不现实的。如果进行了任何此类测试,那都是 20 多年前的非标准合规性测试std::string
(因为不可能存在,因此标准不一致)。
它在通过时仍然是 UB(char const*)0
并且nullptr
由于惯性,并且将继续这样做,直到有人提出方案,并证明了成本微不足道,而好处是没有。
std::string
从文字构造 achar const[N]
已经是一个低性能的解决方案;您在编译时已经拥有字符串的大小,然后将其放在地上,然后在运行时遍历缓冲区以查找'\0'
字符(除非进行了优化;如果是这样,则空检查同样可以优化)。高性能解决方案涉及了解长度并告知std::string
它,而不是从'\0'
终止的缓冲区复制。