访问冲突写入位置 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 部分为零,而iz 第一次通过循环时都为零,因此您得到0xcccccccc + 0 + 0 + 0 作为内存地址。


要对此进行调试,请使用调用堆栈并找到调用fillMap 的函数。然后检查用于成员访问 (-&gt;) 的指针来自的那个函数。

【讨论】:

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,作为查找未定义行为情况的一种方式。很可能,您从未初始化 myMapmyMap 内部的一些指针。检查您的初始化代码是否存在错误。

【讨论】:

平铺 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

写入位置0x00460000时发生访问冲突,这是啥原因?

opencv中的访问冲突写入位置

为啥在内存位置写入访问冲突[重复]

例外:使用 strcpy_s 时访问冲突写入位置