0

ポインターが何らかのベクトルを指すようにしようとしていますが、関数が終了した後、デバッガーはポインターがそのベクトルを指していないことを示します。関連するコードは次のとおりです。

#pragma once
#include "Configuration.h"
#include "Enemy.h"

class FireBall:public sf::Sprite{
public:
    FireBall(const sf::Vector2f position,  Tile * startTile);
    void moveFB();
    void setTrail(vector<Tile *> *trail);
    void removeTrail();

private:
    sf::Vector2f _position;
    vector<Tile *> *_p2_trail;
    vector<Tile *>::iterator _it2Tile;
    sf::Clock _clock;
    int _lastMoveTime;

    float getDecimalPart(float number);
};


void FireBall::setTrail(vector<Tile *> *trail){
    _p2_trail = trail; // here it points to the vector (SHOULED REMAIN LIKE THAT AFTER FUNCTION ENDS....)
    _it2Tile = _p2_trail->begin(); // setting iterator to begin
}


void GameBoard::setFireBall(bool set, float x, float y){
    if (set)
        _p2FB = new FireBall(sf::Vector2f((float)x*OFFSET,(float)y*OFFSET),        _gameBoard[x][y]);
    else{
        _p2FB->removeTrail();
        delete _p2FB;
    }

    _hasFireBall = set;
    _p2FB->setTrail(&_player->getTrail());
    // at this point _p2FB no more points to the vecotr! why?!!
}

プレーヤーヘッダー:#pragma once #include "Configuration.h" #include "Character.h"

class Player:public Character{
public:
    Player(vector< vector <Tile *>> &gameBoard, const sf::Vector2f position, const     IMAGE img);
    bool isLegalMove(const sf::Vector2f &position);
    void move(sf::Vector2f &direction, Tile ** previousTile, Tile ** currentTile);
    void act();

    void setShielded(const bool shieldMode){ _sheilded = shieldMode; };
    bool getShielded() const {return _sheilded; };
    vector<Tile *> getTrail(){ return _trail; };
    void addToTrail(Tile * tile);
    void convertTrailToShield();
    void removeTrail();
    void fixBoardPosition();
    void updateShielded(const pair<int,int>& prevPosition);
private:
    bool _sheilded;
    vector<Tile *> _trail;

};

4

3 に答える 3

3

Player::getTrail() は「vector」型の一時オブジェクトを返し、_p2FB->setTrail() 呼び出しでそのポインタとストアを取得します。この場合、テンポラリの有効期間は式の最後までです。そのため、setTrail 呼び出しの直後では、ポインタ Fireball::_p2_trail は無効です。

于 2012-06-01T12:48:46.557 に答える
1

setFireBall()if setis false で を削除し、_p2FB2 行後に を呼び出して使用しますsetTrail()。削除されたポインターでメソッドを呼び出しています。

また、ゲームはマルチスレッドですか? 別のスレッドが、プレイヤーのベクトルへのポインターを取得してからデバッガーが無効であると言うまでの間に、プレイヤーのベクトルを変更/削除している可能性がありますか?

于 2012-06-01T12:13:32.390 に答える
0

コンストラクターが設定されたトレイルを呼び出す場合は、ベクターをスタックに設定する代わりに、ヒープに入れてポインターを渡してみてください。スタックではなくヒープ上のオブジェクトでポインターを操作することをお勧めします。スタック上にあり、それへのポインターを保存しようとすると、スコープが終了すると解放されます。

于 2012-06-01T12:18:31.870 に答える