我花了一段时间才弄清楚为什么一些cout输出似乎消失在以太中.罪魁祸首:
std::cout<< "This line shows up just fine" << std::endl;
const char* some_string = a_function_that_returns_null();
if (some_string == 0)
std::cout<< "Let's check the value of some_string: " << some_string << std::endl;
std::cout<< "This line and any cout output afterwards will not show up" << std::endl;
Run Code Online (Sandbox Code Playgroud)
上面代码段的输出将是:
This line shows up just fine
Let's check the value of some_string:
Run Code Online (Sandbox Code Playgroud)
因此将NULL输入cout将禁用所有输出.为什么?以及如何解决它?
这不会一直发生 - 具有相同代码的同事获得所有预期的输出.如果你想知道为什么我不能阻止使用if语句将NULL输入cout:我在大型代码库中工作,并且不知道这会发生在哪里!我所知道的是我从未出现过的cout陈述.
更多信息:
a_function_that_returns_null()实际上是getenv("HOST").我检查了命令行echo $HOST,因为HOST变量是空的.如果我这样做export HOST=(bash风味),输出就在那里.我不知道HOST变量最初包含什么,也不知道getenv在修改HOST变量之前最初返回的内容; 我所知道的(some_string == 0)都是真的.
在研究这个问题的示例代码时,我假设它是Undefined Behavior,它阻止了后续的std::cout打印使用.但事实证明,尝试打印空指针导致std::ios_base::badbit并std::ios_base::failbit设置在其流状态,这是其不可操作的真正原因.因此,我现在很好奇是否真的是(尝试)打印空指针的未定义行为.所以这是我的问题:
打印空指针是未定义的行为吗?如果是这样,那么流插入器会导致什么呢?我非常确定插入器足够智能,不会取消引用空指针.
我还想知道为什么插入器在此上下文中遇到空指针时设置其错误掩码(具体而言badbit).为什么它不像字符串文字的终止那样对待它?
我没有标准的方便,到目前为止我只发现了一个来源,不幸导致了一个死链接.