【问题标题】:c++ BWAPI exception access violationc++ BWAPI异常访问冲突
【发布时间】:2012-08-23 13:01:45
【问题描述】:

是否有人使用 BWAPI 在访问当前游戏的 Unit 对象时遇到访问冲突错误?

我确定错误不在我的代码中.. 无论如何.. 有什么办法可以避免访问冲突吗?

我有时会在下面的注释中遇到此错误.. 下面的代码执行了很多次,但有时我会收到错误..

int Squad::getSize() {

    int no = 0;

    for (int i = 0; i < (int) agents.size(); i++) {

        BaseAgent* agent = agents.at(i);

        if (agent != NULL && agent->isAlive() && agent->getUnit() != NULL && !agent->getUnit()->isBeingConstructed()) // this line
            no++;
    }

    return no;
}

这是我用来从向量中删除 BaseAgent 的代码。分析一下,看看我能不能做得更好:

void AgentManager::cleanup() {

    //Step 2. Do the cleanup.
    int cnt = 0;
    int oldSize = (int)agents.size();
    for (int i = 0; i < (int)agents.size(); i++) {

        if (!agents.at(i)->isAlive()) {

            delete agents.at(i);

            agents.erase(agents.begin() + i);
            cnt++;
            i--;
        }
    }

    int newSize = (int)agents.size();
}

BaseAgent 代码在此link

【问题讨论】:

  • 为什么不尝试检查指针是否为 NULL?
  • 我已经完成了..不是空指针..
  • 人族 imba,只是说
  • 您缺少NULL 检查agent-&gt;getUnit()
  • @juanchopanza 我也已经这样做了。我从代码中删除了,因为问题不在于

标签: c++ exception access-violation


【解决方案1】:

我推测这一行:

BaseAgent* agent = agents.at(i);

正在返回一些未设置为0 的无效指针。

查看您的cleanup 代码,它看起来有点复杂。我建议

  1. 循环遍历整个向量,删除死元素和 将指针设置为0

  2. 循环结束后,使用erase-remove idiom从向量中删除所有NULL指针。

第一步

for (unsigned int i = 0; i < agents.size(); ++i) {
    if (!agents.at(i)->isAlive()) {
       delete agents.at(i);
       agents.at(i) = 0;
}

第二步

agents.erase(std::remove(agents.begin(), agents.end(), 0), agents.end()); 

【讨论】:

  • @thiagoh 他的意思是agents 数组可以包含例如悬空指针:您释放了内存,但忘记从数组中删除指针。之后,您尝试使用指针做某事并崩溃
  • 我确实认为问题是这样的,@SingerOfTheFall.. 问题是.. 维护代码的人是BWAPI,我无权访问.. =/ 所以我还能做些什么来避免它?什么?
  • @thiagoh,BaseAgent 是您的课程还是 API 课程?如果是您的,请将其添加到问题中。
  • @SingerOfTheFall 你看到我刚才放在帖子底部的删除 BaseAgent 的代码了吗?
  • @thiagoh,是的,我现在正在考虑它,以及检查课程的代码。
猜你喜欢
  • 2012-11-14
  • 2022-01-07
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多