-1

私はローグライク ゲームに取り組んでおり、ほとんどの場合、レベルに 3 つのモンスターが存在するように設定しています。だから私はモンスターへの3つのポインタを持っています. それらはすべてNULLから始まります。

そのモンスターが死亡した後、ポインターを NULL に戻すにはどうすればよいですか? それとも、私は間違った考えを持っていますか?基本的に、そのポインターが別のモンスターとして再生されるまで、モンスターを削除する必要があります。

いくつか試してみましたが、セグフォルトが発生し続けます。

消去、削除、単純にNULLに設定して再ポイントしてみました。それを理解することはできません。

ポインタを設定する方法は次のとおりです。

CreatureFactory myCreatures = CreatureFactory::instance();
    Creature * pCreature1 = NULL;
    Creature * pCreature2 = NULL;
    Creature * pCreature3 = NULL;;

    ItemFactory myItems = ItemFactory::instance();
    Item * pItem1 = myItems.generateItem();

    dl.placeInGame(personPlaying,randomGen);
    int monsterCount = 0;
    int turnCount = 0;
    bool playingGame = true;
    char playerController;

    while (playingGame){
            if ((turnCount % 2 == 0) && (personPlaying.getHP() < personPlay$
                    personPlaying.generateHP();
            }
            if (((turnCount % 3) == 0) && (monsterCount < 2)){
                    if(pCreature1 == NULL){
                            pCreature1 = myCreatures.generateCreature(4);
                            dl.placeInGame(pCreature1,randomGen);
                            monsterCount += 1;
                    }
                    else if(pCreature2 == NULL){
                            pCreature2 = myCreatures.generateCreature(4);
                            dl.placeInGame(pCreature2, randomGen);
                            monsterCount += 1;
                    }
                    else if(pCreature3 == NULL){
                            pCreature3 = myCreatures.generateCreature(4);
                            monsterCount += 1;
                    }
            }
            dl.dump();
            personPlaying.dumpStats();

 CreatureFactory code..
 CreatureFactory & CreatureFactory::instance(){
    static CreatureFactory myObj;
    return myObj;
}

CreatureFactory::CreatureFactory(){
    m_mtRandom.seed( time(NULL) );
    fstream xmlFile;
    xmlFile.open("critters.xml");
    vector<XMLSerializable*> pObjects;
    parseXML(xmlFile, pObjects);

    XMLSerializable * pObject;

    for(auto it = pObjects.begin(); it != pObjects.end(); it++){
            pObject = (*it);
            Creature * pCreature = dynamic_cast<Creature*>(pObject);
            if (pCreature != NULL){
                    m_vCreatures.push_back(pCreature);
            }
    }
}

CreatureFactory::~CreatureFactory(){

}
    Creature * CreatureFactory::generateCreature(int iMaxLevel) {
    vector<Creature*> tempCreatures;

    for(auto it = m_vCreatures.begin(); it != m_vCreatures.end(); it++){
            if ((*it)->getLevel() <= iMaxLevel){
                    tempCreatures.push_back((*it));
            }
    }
    int randomCreature = (m_mtRandom() % (tempCreatures.size() - 1));


    Creature * pCreature = tempCreatures.at(randomCreature);

    Creature * pReturnValue = new Creature(*pCreature);

    return pReturnValue;
}

次に、大量のループを実行し、大量のクラスを使用します。これらのモンスター オブジェクトへのポインタは、約 6 つか 7 つのクラスを通過します。そのうちの 1 つは、HP が 0 になったときに NULL に設定する必要があります。

ありがとう

4

1 に答える 1

4

c++ では、ポインタを null に設定しないでください。オブジェクトはメモリ内にまだ存在しますが、それへの参照はありません-> メモリ リーク。代わりに、オブジェクトを削除する必要があります。

delete pCreatureN;

これにより、基本的にメモリからオブジェクトが削除され、ポインターが null ポインターになります。その後pCreatureN = NULL;は大丈夫です。

于 2013-04-24T08:54:38.180 に答える