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 に答える