c++ - Release模式下的 OpenGL 粉红色

标签 c++ visual-studio opengl game-engine

OpenGL 显示空白纹理在 Debug模式下显示为白色,在 Release模式下显示为粉红色,关键仅在运行时库中不同(发布:MT,调试:MTd) .

IDE:Visual Studio 2013(更新 5)

问题 - 为什么会发生以及如何解决?

发布:img

调试:img

最佳答案

您很可能是从未初始化的内存中读取数据。为了帮助调试此类问题,在调试构建中,运行时库(以及取决于编译器工具链的编译器)插入代码,用金丝雀值填充所有内存分配模式。这些模式可能出现在越界读取或未初始化的内存中。类似地,健全性检查代码测试完整性模式以测试越界写入。

由于在当前广泛使用的计算机架构中,内存保护仅在特定粒度下起作用,即页面大小,在大多数情况下为 4096 字节¹,因此使用这些金丝雀值来检测内存损坏。页面大小 p>

无论如何,您在 debugrelease 构建中看到不同值的原因是,对于每种情况,内存实际上被不同地初始化,并且显示出来. 对您来说重要的是,由于出现差异,您的代码做错了什么,即您有一个必须修复的错误!

如果您是为 Linux 构建此程序,我的建议是通过 Valgrind memory debugger 运行您的程序。 . Valgrind 是专门为调试此类错误而设计的工具。它的工作原理大致是通过模拟 CPU 运行您的代码,跟踪每一个内存分配和访问,告诉您一直到源代码行,哪里发生了非法访问。

有一个关于 Valgrind 替代 Windows 开发的 SO Q&A:Is there a good Valgrind substitute for Windows?


1:大页面(通常为 2MiB)和千兆页面(通常为 1GiB)通常也可用,但除非您明确要求,否则它只是标准页面大小。

关于c++ - Release模式下的 OpenGL 粉红色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770593/

相关文章:

visual-studio - Visual Studio 调试时出现极端滞后峰值

.net - 目录内的 T4 模板

c++ - 比例在 OpenGL 中重要吗?

c# - 如何正确地将浮点指针从 C 库传递到其 C# 包装器

c++ - 如何检查文件是否在 Windows 网络共享上?

c# - 访问文档属性 - VB 中的 Excel 工作簿/CSV

c++ - GLFW setUserPointer/getUserPointer 发送/访问类崩溃

c++ - 现代 OpenGL 立方体旋转无法按预期工作

c++ - 如何识别代码中const char*和const char[]的类型?

c++ - Builder 模式实现中的 Incomplete Type 错误