OpenGL 显示空白纹理在 Debug模式下显示为白色,在 Release模式下显示为粉红色,关键仅在运行时库中不同(发布:MT,调试:MTd) .
IDE:Visual Studio 2013(更新 5)
问题 - 为什么会发生以及如何解决?
发布:
调试:
最佳答案
您很可能是从未初始化的内存中读取数据。为了帮助调试此类问题,在调试构建中,运行时库(以及取决于编译器工具链的编译器)插入代码,用金丝雀值填充所有内存分配模式。这些模式可能出现在越界读取或未初始化的内存中。类似地,健全性检查代码测试完整性模式以测试越界写入。
由于在当前广泛使用的计算机架构中,内存保护仅在特定粒度下起作用,即页面大小,在大多数情况下为 4096 字节¹,因此使用这些金丝雀值来检测内存损坏。页面大小 p>
无论如何,您在 debug 和 release 构建中看到不同值的原因是,对于每种情况,内存实际上被不同地初始化,并且显示出来. 对您来说重要的是,由于出现差异,您的代码做错了什么,即您有一个必须修复的错误!
如果您是为 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/