在过去的两天里,我一直陷入违规行为,我似乎无法逃脱 . 我已经使用了断点并找到了错误的位置,但我只是希望你们中的一个人知道问题是什么而我不必复制粘贴所有代码-.-
我越来越
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 回答
未初始化的指针,或存储在已释放的内存中的指针 . 我认为
cccccccc
是第一个,而cdcdcdcd
是第二个,但它随编译器/库的实现而变化 .对于您的特定代码,可能还没有分配
myMap
,那么myMap[0][0]
将导致对0xcccccccc
的访问尝试 .也可能发生
myMap
是类的开头,并且类指针未初始化:发生这种情况是因为成员函数不是虚拟的,因此编译器知道要运行的代码并将对象指针作为隐藏参数传递 . 最终,编译器会发出如下计算:
this
,未初始化,是0xcccccccc
. 显然offsetof
部分为零,并且i
和z
在第一次循环时都为零,因此您将获得0xcccccccc + 0 + 0 + 0
作为内存地址 .要调试它,请使用调用堆栈并找到调用
fillMap
的函数 . 然后检查用于成员访问的指针(->
)来自的函数 .在MSVC和调试模式下,调试内存分配器将所有返回的内存设置为0xcccccccc,以查找未定义行为的情况 . 很可能,你从未初始化
myMap
,或者myMap
中的一些指针 . 检查初始化代码是否存在错误 .当我尝试使用for-loop填充我自己类类型的表元素中的字符串值时出现类似错误 . 我在那个表中声明了1000个元素,所以我放了这样的东西:
不幸的是,就像字符串一样,我发现我可能坚持不存在的fillinf元素,表格中的元素编号为1000 . 我设法通过更改循环 Headers ,在1000之前删除等号来解决这个问题 .
试着看看你是不是想打电话给那些不存在的东西 .
对于这个问题中发生的所有答案和评论,这里有关于Visual C中内存填充的很好的参考:
http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?