所以我遇到了我一生中见过的最奇怪的错误之一。 我买了一本 DirectX 11 书,里面有一些 [示例代码]:http://www.d3dcoder.net/d3d11.htm 我很确定在某个时间点我设法编译并运行了每个示例应用程序,但现在,我在运行时遇到了“访问冲突写入位置 0xCCCCCCCC”错误。
现在,这发生在下面一行:
ShadowsApp::ShadowsApp(HINSTANCE hInstance) : D3DApp(hInstance)
{
mMainWndCaption = L"Shadows Demo"; <- Crashes here !!!
mLastMousePos.x = 0;
mLastMousePos.y = 0;
...
}
mMainWndCaption 在 .h 中这样声明
std::wstring mMainWndCaption;
并在ShadowsApp继承的类的构造函数中设置默认值
D3DApp::D3DApp(HINSTANCE hInstance) :
mhAppInst(hInstance),
mMainWndCaption(L"D3D11 Application"),...
我想,这已经很奇怪了...... 现在最奇怪的部分出现了,当我在 d3dApp.h 中声明任何类型的任何变量时,我不再有“访问冲突写入位置 0xCCCCCCCC”错误,一切都完美地构建和运行。 作为一名 C# 程序员,这对我来说完全没有意义。类中随机变量的声明怎么能“修复”这样的事情?!
任何建议将不胜感激:-)
最佳答案
This page对您在处理堆栈和堆时可能遇到的各种“魔法值”有很好的描述和背景。
来自页面:
If you are seeing the 0xcccccccc bit pattern it means that you are reading memory that is on the current thread stack that has not been initialised.
鉴于您到目前为止发布的代码片段,以及您所描述的关于用基类中声明的另一个变量“修复”它的内容,听起来基类对象和派生对象可能不一致内存布局。它们在同一个库或可执行文件中吗?检查您的编译标志并确保它们匹配。
一种策略是将问题减少到重现问题的最少步骤集。您可以复制您的项目并开始删除字段和方法直到它起作用,然后看看这是否有助于您进一步隔离它。
关于c++ - 访问冲突写入位置 0xCCCCCCCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498923/