访问冲突写入位置0xcccccccc

时间:2011-05-22 03:21:56

标签: c++ access-violation

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

我正在

  
    

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

  

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

4 个答案:

答案 0 :(得分:12)

未初始化的指针,或存储在已释放的内存中的指针。我认为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])
未被初始化的

this0xcccccccc。显然,offsetof部分为零,iz在您第一次循环时都为零,因此您将0xcccccccc + 0 + 0 + 0作为内存地址。


要调试它,请使用调用堆栈并找到调用fillMap的函数。然后检查用于成员访问的指针(->)来自哪个函数。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

当我尝试使用for-loop填充我自己类类型的表元素中的字符串值时出现类似错误。我在那个表中声明了1000个元素,所以我放了类似的东西:

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

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

试着看看你是不是想打电话给那些不存在的东西。

答案 3 :(得分:0)

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