指针在某种程度上被无效,从而导致访问冲突

Pointers are being invalidated some how, which leads to an Access Violation

本文关键字:访问冲突 在某种程度上 无效 指针      更新时间:2023-10-16

开发环境是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的容量增加时,它肯定会使迭代器和指向现有对象的指针失效。您所看到的特殊数学关系将与特定实现的增长模式有关。

解决方案是在矢量大小发生变化时,不保留指向矢量内容的指针。您可以保留一个指向向量的指针和一个索引,这将继续有效。