【问题标题】:Access violation writing location 0xCCCCCCCC访问冲突写入位置 0xCCCCCCCC
【发布时间】:2013-07-06 02:00:38
【问题描述】:

所以我遇到了我一生中见过的最奇怪的错误之一。 我买了一本 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 中声明 ANY 类型的 ANY 变量时,我不再出现“访问冲突写入位置 0xCCCCCCCC”错误,一切都构建并完美运行。 作为一个 C# 程序员,这对我来说完全没有意义。在一个类中声明一个随机变量怎么能“修复”这样的事情?!

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

【问题讨论】:

  • “当我在 ShadowsApp.h 中声明任何类型的任何变量时”是指为 ShadowsApp 类型声明成员变量吗?另外,您使用的是哪个版本的 MSVC? (我假设您使用的是 Visual Studio,因为这是一个 directx 项目)
  • 是的,比如说:int foo;繁荣它工作......
  • 这有更多的上下文吗?有问题的实例在哪里构造?
  • 嗯,这几乎是应用程序的开始: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd) { ShadowsApp theApp(hInstance); if( !theApp.Init() ) 返回 0;返回 App.Run(); }
  • 您的代码可能在随机内存上乱涂乱画,并且创建“牺牲变量”会导致乱涂乱画出现在该变量上,而不是 mMainWndCaption 的内部指针上。

标签: c++ directx access-violation


【解决方案1】:

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

从页面:

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

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

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

【讨论】:

  • 感谢您的建议!是的,我的解决方案只有一个包含所有 .cpp 和 .h 的 .vcxproj。据我所知,它们都应该以相同的二进制文件结尾。实际上,我虽然想将我的应用程序的大小减少到最小以隔离问题,但我希望我不必这样做;-) 看起来我别无选择,如果我想知道这里到底发生了什么.. .
【解决方案2】:

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

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

初始化指针。

mMainWndCaption = L"阴影演示";

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

【讨论】:

  • 好吧,如果我这样做,mMainWndCaption 包含它从基类构造函数获得的默认字符串:“D3D11 Application”。
  • @Yann 这个指针怎么样?
  • @Yann:在这种情况下,请确保您实际上可以为 mMainWndCaption 分配新值,并且您不应将标题作为参数传递给构造函数。如果我没记错的话,D3DApp 是微软编写的用于 DXSDK 的示例类。因此,如果给它分配新值会做一些奇怪的事情,我不会感到惊讶。
  • @Borgleader 我不完全确定您所说的“这个 ptr 怎么样”是什么意思,但是,我觉得没问题:i.imgur.com/XKk6ikF.png
  • @Yann:然后注释掉这一行,看看会发生什么。注释掉代码块可能会帮助您找到问题所在。在此行之前安装断点,看看此时会发生什么。通过“步入”进行调试。 D3DApp 中的某些内容可能通过指针访问 mMainWndCaption,并且当您分配字符串时,数据会被破坏。 “D3DApp 是一个完全从头开始编写的类”,这意味着它比 Microsoft 类更容易出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2020-09-04
相关资源
最近更新 更多