在linux上使用gcc 4.9.2的奇怪行为

时间:2015-12-27 13:11:33

标签: c++ linux opengl gcc

我一直在调试一些在Windows上工作的代码的黑色纹理问题,今天我发现它可能与我处理openGL调用的方式无关......以下代码片段包含{{1行。

如果我注释掉std::cout行,我会得到黑色纹理。如果我把它留在代码中,我会正确渲染纹理。

cout

我做错了吗?这是编译器问题吗?

1 个答案:

答案 0 :(得分:2)

不,这不是编译器问题。

这是未定义行为/损坏内存的经典示例。在您的代码到达此部分之前的某个时刻,错误最终会破坏堆或堆栈,通过运行数组的末尾,取消引用未初始化的指针或无数其他未定义行为的示例。

腐败的性质不够严重,导致立即发生段错误或崩溃,但代码执行一直持续到此为止。此时,根据随机因素,代码对齐和其他C ++库调用(它们本身可能涉及堆分配)足以触发未定义行为的可见结果,这是您在此处观察的。

没有单一的通用配方来识别真正的错误,我很害怕。它将成为试验和错误的结合,并使用像valgrind这样的仪器工具来识别和隔离真正的错误。您可以在Linux发行版上找到valgrind,它可以很好地识别和查找这些类型的错误。