花一整个下午来调试一个问题。完全混淆了为什么我可以从空列表中打印第一个元素。这似乎是C ++问题或我的程序问题。当我尝试访问第一个元素时,C ++似乎随机指向本地地址
int main(int argc, char **argv)
{
string crc_command = "ls /tmp/jacknotexist";
list<string> crc_output;
printf("list begin:%s\n", (*(crc_output.begin())).c_str()); // The result is "ls /tmp/jacknotexist". Why???
printf("list size:%d\n", crc_output.size()); // It is zero as expected.
}
答案 0 :(得分:2)
结果是“ls / tmp / jacknotexist”。为什么???
实际上,结果是未定义的行为:即使列表为空,其begin()
函数也会返回一些值(恰好等于end()
函数返回的值)。当您取消引用迭代器时,它会再次产生一些值。此时,行为未定义,程序可能在任何其他平台上崩溃。
本质上,这与取消引用无效指针时获得的行为相同:程序可能会崩溃,也可能不会崩溃,它可能会产生任何值。在您的情况下,无效值恰好与crc_command
变量的内容一致。