2

是否有人使用 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 代码在此链接上

4

1 回答 1

1

我推测这条线:

BaseAgent* agent = agents.at(i);

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

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

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

  2. 在循环之后,使用erase-remove 习惯用法从向量中删除所有NULL指针。

第1步

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

第2步

agents.erase(std::remove(agents.begin(), agents.end(), 0), agents.end()); 
于 2012-08-23T13:17:47.733 回答