指针有些失效,导致访问冲突

时间:2012-01-26 02:51:13

标签: c++ pointers native access-violation invalidation

Dev Environment是VS2010,语言是混合C#(GUI)和C ++(Sim Engine),为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向量成员的对象问题。我们的矢量实现中是否存在可能导致此行为的问题?

2 个答案:

答案 0 :(得分:0)

腐败的性质表明有人使用realloc搞砸了。

答案 1 :(得分:0)

  

我只是意识到,据我所知,我们只看到了std向量成员的对象问题。我们的矢量实现中是否存在可能导致此行为的问题?

这不是矢量实现的问题,而是你如何使用它的问题。

vector无论何时增加其容量,都会使迭代器和指向现有对象的指针无效。您所看到的特殊数学关系将与您特定实施的增长模式相关。

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