c++ - 访问冲突写入位置 0xCCCCCCCC

标签 c++ directx access-violation

所以我遇到了我一生中见过的最奇怪的错误之一。 我买了一本 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/

相关文章:

c++ 字符串行为在定义和在 strcat 函数中是不同的

directx - Up Vector 在 DirectX 中到底做什么?

c++ - 相机移动时模型消失 DirectX

winforms - 来自组合的 AccessViolationException : Attempted to read or write protected memory

c++ - MPI 中的静态计算和动态计算有什么区别?

c++ - 当初始化列表中没有更多元素时,是否初始化数组的其余元素

创建内存分配器时出现 C++ 继承错误

c++ - Directx 9 地形碰撞

c# - wkHTMLtoPDF 内存损坏和 AccessViolationException

c++ - 虚拟析构函数导致访问冲突