在过去的 2 天里,我一直被一个我似乎无法摆脱的违规行为所困扰。 我已经使用了断点并找到了错误所在,但我只是希望你们中的一个人能知道问题出在哪里,而无需我复制+粘贴我的所有代码-.-
我得到了
First-chance exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 0xcccccccc. Unhandled exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 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 类型的二维数组。几天前我有这个工作,直到我添加了一些其他类并且它都停止工作了!
最佳答案
要么是未初始化的指针,要么是存储在已释放的内存中的指针。我认为 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
的函数。然后检查用于成员访问的指针 (->
) 来自的函数。
关于c++ - 访问冲突写入位置 0xcccccccc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085827/