我让这段代码工作得很好。 if
中的陈述属实,导致我打印TRUE
。但是,当我删除else
语句的内容时,这会给我分段错误,即使它没有执行(仍然打印TRUE
)。
有没有人知道为什么会这样?
if(parser->checkToken(Token::Type::Int)) {
std::cout << "TRUE" << std::endl;
parser->scanner->getToken().getNumber();
parser->advance();
} else {
std::cout << "FALSE" << std::endl;
parser->requireToken(Token::Type::String);
}
P.S。解析器是unique_ptr
答案 0 :(得分:0)
不,不执行的代码不会导致分段错误。
其他一些代码(在您显示的代码之前执行)将成为原因。
其他代码表现出未定义的行为(根据C ++标准中“未定义”的含义),并且不应覆盖某些内存区域。从代码中删除else
块可能导致实现(编译器,链接器等)重构您使用的程序和数据在内存中的布局方式(例如,代码和数据位于内存中)。反过来,这可以改变你的违规代码覆盖内存的影响(例如,它会改变被覆盖的内存是用于存储变量,还是操作认为你的程序不应该访问的内存区域)。 / p>
答案 1 :(得分:0)
没有看到完整的代码,很难说,但我猜是
parser->scanner->getToken().getNumber();
parser->advance();
(或其他未附加的代码)具有某种与之相关的未定义行为,只是运气问题,您在else
部分遇到分段错误(是的,您很幸运在这方面。想想如果你无法再现它将会发生什么。)
尝试查看scanner
,getToken()
和getNumber()
在其实施中执行的操作,并找到可能导致未定义行为的任何操作(也许getToken()
会返回对在函数内初始化的对象?)。
答案 2 :(得分:-1)
当然可以。
添加/减去代码,以及它的关联数据,将内存中的内容移动到不同的地方,即使在一种情况下,代码本身并未实际执行。
如果您的代码具有未定义的行为,则上述操作可以在“工作”,崩溃,鼻子恶魔等之间切换您的流程操作。