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() 调用获取它的指针并存储。在这种情况下,临时的生命周期只到表达式的结尾。因此,指针 Fireball::_p2_trail 在 setTrail 调用之后是无效的。

于 2012-06-01T12:48:46.557 回答
1

setFireBall()ifset为 false 时,您删除_p2FB,然后在 2 行后通过调用来使用它setTrail()。您正在对已删除的指针调用方法。

另外,游戏是多线程的吗?当您获得指向它的指针和调试器说它无效时,是否有不同的线程正在修改/删除播放器的向量?

于 2012-06-01T12:13:32.390 回答
0

如果您的构造函数调用设置跟踪,则不要在堆栈上设置向量,而是尝试将其放入堆中并传递一个指针。在堆上而不是在堆栈上使用带有对象的指针是一种很好的做法。如果它在堆栈上并且您尝试保存指向它的指针,它将在其作用域结束时被释放。

于 2012-06-01T12:18:31.870 回答