我一直在调试一些在Windows上工作的代码的黑色纹理问题,今天我发现它可能与我处理openGL调用的方式无关......以下代码片段包含{{1行。
如果我注释掉std::cout
行,我会得到黑色纹理。如果我把它留在代码中,我会正确渲染纹理。
cout
我做错了吗?这是编译器问题吗?
答案 0 :(得分:2)
不,这不是编译器问题。
这是未定义行为/损坏内存的经典示例。在您的代码到达此部分之前的某个时刻,错误最终会破坏堆或堆栈,通过运行数组的末尾,取消引用未初始化的指针或无数其他未定义行为的示例。
腐败的性质不够严重,导致立即发生段错误或崩溃,但代码执行一直持续到此为止。此时,根据随机因素,代码对齐和其他C ++库调用(它们本身可能涉及堆分配)足以触发未定义行为的可见结果,这是您在此处观察的。
没有单一的通用配方来识别真正的错误,我很害怕。它将成为试验和错误的结合,并使用像valgrind这样的仪器工具来识别和隔离真正的错误。您可以在Linux发行版上找到valgrind,它可以很好地识别和查找这些类型的错误。