指针在某种程度上被无效,从而导致访问冲突
Pointers are being invalidated some how, which leads to an Access Violation
开发环境是VS2010,语言是C#(GUI)和C++(模拟引擎)的混合,为32位Windows编译。例外情况发生在我们测试过的每个版本的Windows上,包括32位XP、32位Vista、32位7和64位7。
我对这个完全不知所措。由于程序的性质(基于事件的模拟),在我们实际尝试访问指针并获取AVE.之前,指针在某个未知时间点无效
我所知道的是,它正在以一种非常特殊的方式被无效,我希望有人能知道是什么导致了这种情况。当AVE发生时,它试图使用的指针已更改为:
(original) - ((size * 2) - 1)
其中,original
是指针所指向的原始地址,size
是所指向对象的大小
例如,其中一个访问冲突发生在本应指向0x58E0
的指针上,而该对象的大小为0x70
。它没有指向0x58E0
,而是指向0x5801
,即0x58E0 - ((0x70 * 2) - 1)
。同样的事情发生在另一个不同类型和大小的物体上,所以这似乎是一种非常具体的关系。
编辑:在上面的文章中,我不是在谈论在代码中进行指针运算,我只是展示了指针应该是什么和当我们引用它并获得访问违规异常时它最终是什么之间的数学关系。希望这能澄清一切。
编辑2:我刚刚意识到,就我记忆所及,我们只在std向量的成员对象中看到过这个问题。我们在向量实现中是否有可能搞砸的东西导致了这种行为?
腐败的性质表明有人使用realloc搞砸了。
我刚刚意识到,在我记忆中,我们只在std向量的成员对象中看到过这个问题。我们在向量实现中是否有可能搞砸的东西导致了这种行为?
这不是矢量实现的问题,而是如何使用它的问题
每当vector
的容量增加时,它肯定会使迭代器和指向现有对象的指针失效。您所看到的特殊数学关系将与特定实现的增长模式有关。
解决方案是在矢量大小发生变化时,不保留指向矢量内容的指针。您可以保留一个指向向量的指针和一个索引,这将继续有效。
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 成员访问是否在空指针上定义C++?
- 堆栈上的 C++ 访问冲突写入异常
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 某种程度上有可能从手柄中获取hmodule
- 在VS2017上调试简单程序时访问冲突(RtlActivateActivationContextUnsafeFast)
- 代码的后一部分在某种程度上影响了前一部分
- 在C++中读取链表上的访问冲突
- ios::app 模式和 fstream::write 是否在某种程度上彼此不兼容
- 访问冲突 在 C 应用程序中
- 美元符号在某种程度上与C++指针有关吗
- c++返回元素在没有代码的行上给出访问冲突
- 在visual c++中的fgets()上接收访问冲突错误
- 指针在某种程度上被无效,从而导致访问冲突
- 在windows上使用std::stringstream时发生访问冲突
- 如何在Linux上编写一段程序使CPU在一定程度上忙碌
- 递归的河内塔,访问冲突/分段错误,在dev c++编译器上
- 用于计时测试的大循环在某种程度上被优化为零
- c++如何在一定程度上读取输入
- 未处理的异常/访问冲突,只要我在变量上使用 OutputDebugStringW()