在过去的两天里,我一直坚持违规,但似乎无法摆脱。
我已经使用断点并找到了错误所在的位置,但我只是希望你们中的一个能知道问题所在,而无需我复制并粘贴所有我的代码-.-
我越来越
现在,快速的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])
尚未初始化的
this
是0xcccccccc
。显然,offsetof
部分为零,并且第一次通过循环,i
和z
均为零,因此您将0xcccccccc + 0 + 0 + 0
作为内存地址。要调试此功能,请使用调用堆栈并找到名为
fillMap
的函数。然后,在该函数中检查用于成员访问的指针(->
)来自何处。