c++BWAPI异常访问违规

c++ BWAPI exception access violation

本文关键字:访问 异常 c++BWAPI      更新时间:2023-10-16

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

我推测这一行:

BaseAgent* agent = agents.at(i);

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

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

  1. 在整个矢量上循环,删除死元素将指针设置为CCD_ 3。

  2. 循环之后,使用擦除-移除习惯用法从向量中移除所有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());