2017-05-28 21 views
-6

我有这段代码工作得很好。在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

什么行导致段错误? –

+4

听起来像_undefined behavior_。 –

+1

请参阅:[什么是分段错误?](https://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault)和[什么是未定义行为?](https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior) –

回答

0

不,不执行代码不能引起分段错误。

其他一些代码(在您显示的代码之前执行)将是原因。

其他代码表现出未定义的行为(根据C++标准中“未定义”的含义),并且覆盖它不应该存在的某些区域的内存。从代码中删除else块可能会导致实现(编译器,链接器等)重新构造其使用的程序和数据在内存中的布局(例如代码和数据位于内存中的位置)。反过来,这又可以改变您的违规代码覆盖内存的影响(例如,它会改变覆盖的内存是用于存储变量,还是您的操作认为您的程序不应访问的内存区域)。

-1

当然可以。

添加/减少代码以及它的关联数据将内存中的东西移动到不同的地方,即使在某些情况下代码本身并未实际执行。

如果你的代码是未定义行为,上面可以切换“工作”,系统崩溃,鼻恶魔等之间的运作过程中

+0

哈哈,我怎么能得到-2和Peter一样的答案? – ThingyWotsit

+0

我没有投票,但你的回答得出了我的相反结论。 – Peter

0

没有看到完整的代码是很难说,但我的猜测是,

parser->scanner->getToken().getNumber(); 
parser->advance(); 

(此处未连接或其它代码)有某种不确定的行为涉及到它,它是只是幸运的是,你正在经历else部分的细分故障(是的,你在这方面很幸运,想想如果你无法再现它会发生什么)。

尝试,看看什么scannergetToken()getNumber()做好执行和查找可能导致未定义行为的任​​何操作(也许getToken()返回到在函数内部初始化的对象的引用?)。