访问冲突写入位置0xcccccccc

Access violation writing location 0xcccccccc

本文关键字:0xcccccccc 位置 访问冲突      更新时间:2023-10-16

在过去的两天里,我一直被困在我似乎无法摆脱的违规行为上。我已经使用了断点并找到了错误所在,但我只是希望你们中的一个人知道问题是什么,而无需我复制+粘贴我的所有代码-.-

我得到了

在 Escape.exe: 0xC0000005:访问冲突写入位置0xcccccccc 0x1027cb1a (msvcr100d.dll) 的首次机会异常。 在 Escape.exe: 0xC0000005:访问冲突写入位置0xcccccccc中0x1027cb1a (msvcr100d.dll) 处未处理的异常。

现在,快速的谷歌搜索让我觉得有一些奇怪的事情正在发生。所有的搜索结果都谈到指针实际上没有指向任何地方(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 类型的 2D 数组。几天前我有这个工作,直到我添加了一些其他类,一切都停止了工作!

未初始化的指针或存储在内存中已释放的指针。 我认为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 的函数。 然后签入用于成员访问(->)的指针来自的函数。

在 MSVC++ 和调试模式下,调试内存分配器将所有返回的内存设置为 0xcccccccc,作为查找未定义行为情况的一种方式。很可能,您从未初始化过myMapmyMap中的某些指针。检查初始化代码是否存在错误。

对于这个问题中发生的所有答案和评论,以下是有关Visual C++中内存填充的良好参考:

  • http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx
  • 操作系统何时以及为什么会在malloc/free/new/delete上初始化内存以0xCD,0xDD等?

当我尝试使用 for 循环在我自己的类类型的表元素中填充字符串值时,也遇到了类似的错误。我在那个表中声明了 1000 个元素,所以我放了这样的东西:

    for (int i = 0; i <= 1000; i++)
    {
        TAble[i].name = "Some Guy";
        TAble[i].age = 4;
    }

不幸的是,与字符串一样,我可能坚持使用不存在的 fillinf 元素,女巫是表中的元素编号 1000。我设法通过更改循环标题、删除 1000 之前的等号来解决这个问题。

试着看看你是否不想调用不存在的东西。