访问冲突写入位置 0xcccccccc
Posted
技术标签:
【中文标题】访问冲突写入位置 0xcccccccc【英文标题】:Access violation writing location 0xcccccccc 【发布时间】:2011-05-22 03:21:55 【问题描述】:在过去的 2 天里,我一直被困在一个我似乎无法摆脱的违规行为上。 我已经使用了断点并定位了错误所在,但我只是希望你们中的一个人知道问题所在,而无需我复制+粘贴所有代码-.-
我来了
Escape.exe 中 0x1027cb1a (msvcr100d.dll) 的第一次机会异常:0xC0000005:。 Escape.exe 中 0x1027cb1a (msvcr100d.dll) 处未处理的异常:0xC0000005:。
现在,快速的谷歌搜索让我觉得发生了一些奇怪的事情。所有的搜索结果都在谈论实际上没有指向任何地方的指针(0xccccccccc 是低内存地址?)。
我还没有在我的代码中使用指针,但无论哪种方式,我都会粘贴函数并指出引发异常的行(粗体):
void mMap::fillMap()
for(int i = 0; i <= 9; i++)
for(int z = 0; z <= 19; z++)
Tile t1; // default Tile Type = "NULLTILE"
myMap[i][z] = t1;
现在 myMap 是一个 Tile 类型的二维数组。几天前我有这个工作,直到我添加了一些其他类,它都停止工作了!
【问题讨论】:
所以如果你注释掉你的这部分代码一切正常吗? myMap 在哪里初始化? myMap 在 mMap.h Tile myMap [10][20]; 【参考方案1】:要么是未初始化的指针,要么是存储在已释放内存中的指针。我认为cccccccc
是第一个,cdcdcdcd
是第二个,但它因编译器/库实现而异。
对于您的特定代码,可能尚未分配myMap
,然后myMap[0][0]
将导致尝试访问0xcccccccc
。
也可能发生myMap
是您的类的开头,而类指针未初始化:
class mMap
Tile myMap[10][20];
public:
void f() myMap[0][0] = 0;
;
mMap* what;
what->f(); // what is an invalid pointer
发生这种情况是因为成员函数不是虚拟的,因此编译器知道要运行什么代码并将对象指针作为隐藏参数传递。最终编译器会发出如下计算:
this + offsetof(Whatever::myMap) + z * sizeof(myMap[0]) + i * sizeof(myMap[0][0])
this
,未初始化,是0xcccccccc
。显然offsetof
部分为零,而i
和z
第一次通过循环时都为零,因此您得到0xcccccccc + 0 + 0 + 0
作为内存地址。
要对此进行调试,请使用调用堆栈并找到调用fillMap
的函数。然后检查用于成员访问 (->
) 的指针来自的那个函数。
【讨论】:
myMap 已在 mMap.h 文件中声明为:Tile myMap [10][20]; @Linky:查看我的编辑。该地址几乎总是由未设置的指针引起的,在您的情况下,myMap
不是指针,因此它必须是指向包含 myMap
的类的指针,这很糟糕。
@Ben Voigt,感谢您的帮助。虽然在 mMap.h 文件中声明了 Tile 类型的数组 myMap(Tile 类)。
@Linky:我明白这一点。我的回答的第二部分和第三部分就是这种情况。
我正在使用驱动程序类测试这些类。如果我输入:mMap mappy;通过调用mMap 类的构造函数,它调用了fillMap(),这就是错误发生的地方。 myMap 数组是本地的,这就是为什么抛出与指针相关的错误让我感到困惑的原因。【参考方案2】:
在 MSVC++ 和调试模式下,调试内存分配器将所有返回的内存设置为 0xcccccccc,作为查找未定义行为情况的一种方式。很可能,您从未初始化 myMap
或 myMap
内部的一些指针。检查您的初始化代码是否存在错误。
【讨论】:
平铺 myMap [10][20];请告诉我如何正确初始化。 0xcccccccc 在使用 /GZ 时发生。 ***.com/questions/370195/…【参考方案3】:对于此问题中出现的所有答案和 cmets,以下是有关 Visual C++ 中内存填充的良好参考:
http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?【讨论】:
【参考方案4】:当我尝试使用 for 循环在我自己的类类型的表元素中填充字符串值时出现类似的错误。我在那个表中声明了 1000 个元素,所以我放了这样的东西:
for (int i = 0; i <= 1000; i++)
TAble[i].name = "Some Guy";
TAble[i].age = 4;
不幸的是,与字符串一样,我可能坚持不存在的 fillinf 元素是表中的元素编号 1000。我设法通过更改循环头来解决这个问题,删除 1000 之前的等号。
试试看你是不是在尝试调用不存在的东西。
【讨论】:
三年后,但也许这会帮助其他有类似问题的人。 :) 干杯!以上是关于访问冲突写入位置 0xcccccccc的主要内容,如果未能解决你的问题,请参考以下文章
C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突
在Project48.exe中的0x7B639D4E (ucrtbased.dll)处抛出异常:0xC0000005。访问违规写入位置 0xCCCCCCCC