在过去的两天里,我一直陷入违规行为,我似乎无法逃脱。 我已经使用了断点并找到了错误的位置,但我只是希望你们中的一个人知道问题是什么而我不必复制+粘贴我的所有代码-.-
我正在
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类型的二维数组。我几天前就开始工作了,直到我添加了其他一些类,这一切都停止了工作!
答案 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])
未被初始化的 this
是0xcccccccc
。显然,offsetof
部分为零,i
和z
在您第一次循环时都为零,因此您将0xcccccccc + 0 + 0 + 0
作为内存地址。
要调试它,请使用调用堆栈并找到调用fillMap
的函数。然后检查用于成员访问的指针(->
)来自哪个函数。
答案 1 :(得分:3)
在MSVC ++和调试模式下,调试内存分配器将所有返回的内存设置为0xcccccccc,以查找未定义行为的情况。很可能,您从未初始化myMap
或myMap
内部的一些指针。检查初始化代码是否存在错误。
答案 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 ++内存填充的很好的参考: