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

我越来越



现在,快速的Google搜索使我认为发生了一些奇怪的事情。所有搜索结果都讨论了指针实际上并未指向任何地方(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的二维数组。几天前,我一直在进行这项工作,直到我添加了其他一些类(class),然后一切都停止了!

最佳答案

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

09-09 23:29