【发布时间】:2012-01-27 09:47:41
【问题描述】:
我有一段代码运行了很多次,突然报告访问冲突。
for(std::list<Projectile>::iterator it = projectiles.begin(); it != projectiles.end();) {
bool finished = ...
// try to print address of collides(), prints always 1
std::cout << &Projectile::collides << std::endl;
// here it crashes:
if(it->collides(&hero)) {
std::cout << "Projectile hits " << hero.getName() << std::endl;
finished = it->apply(&hero);
}
// ...
if(finished) {
it = projectiles.erase(it);
} else {
++it;
}
}
所以 VS 调试堆栈跟踪表明,在行 if(it->collides(&hero)) { 程序尝试调用 cdcdcdcd() 的方法,这会导致访问冲突。
it、*it 和 hero 根据 VS 是有效对象。
所以我假设cdcdcdcd() 实际上应该是collides()。由于碰撞是一种非虚拟方法,它的地址应该基本上不会改变或者?
问题是方法collides()在成功之前执行了几次,但突然它不再起作用了。
会不会是地址变了?我覆盖了吗?
请帮帮我!另外,我感谢有关此代码不合适的任何信息的信息:)
【问题讨论】:
-
我认为您发布的 sn-p 太小了。这段代码似乎没有任何明显错误,真正的问题可能出在其他地方。你能创建一个SSCCE吗?
-
经常出现这样的问题是因为缺少锁定。对这个集合的任何访问都应该被锁定,否则一个线程可能会清除它,而另一个线程正在迭代。最后,症状很难重现,因为这是一个“时间问题”。
标签: c++ access-violation