7

所以我有我一生中见过的最奇怪的错误之一。我买了一本带有一些 [示例代码] 的 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# 程序员,这对我来说完全没有意义。在一个类中声明一个随机变量怎么能“修复”这样的事情?!

任何建议将不胜感激:-)

4

2 回答 2

5

运行时出现“访问冲突写入位置 0xCCCCCCCC”错误。

您正在尝试在调试版本中使用 msvc 下的未初始化指针。

初始化指针。

mMainWndCaption = L"阴影演示"; <- 在这里崩溃!!!

在此位置安装断点,在调试器下运行应用程序,并调查变量的内容(在“监视”窗口中,或将鼠标悬停在单个变量上),包括this指针。

于 2013-07-06T02:37:41.173 回答
5

该页面对您在处理堆栈和堆时可能遇到的各种“神奇值”有很好的描述和背景。

从页面:

如果您看到 0xcccccccc 位模式,则意味着您正在读取当前线程堆栈上尚未初始化的内存。

鉴于您到目前为止发布的代码片段,以及您所描述的关于使用基类中声明的另一个变量“修复”它的内容,听起来基类和派生对象可能在它们的内存布局方面不一致。它们在同一个库或可执行文件中吗?检查您的编译标志并确保它们匹配。

一种策略是将问题减少到重现问题的最小步骤。您可以复制您的项目并开始删除字段和方法,直到它工作为止,看看这是否有助于您进一步隔离它。

于 2013-07-06T02:42:46.580 回答