功能结束后丢失指针数据

时间:2012-06-01 12:08:19

标签: c++ pointers vector

我正在尝试使指针指向某个向量,但在函数结束后,调试器显示指针不再指向该指针。 相关代码如下:

#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一次     #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;

};

3 个答案:

答案 0 :(得分:3)

Player :: getTrail()返回一个类型为“vector”的临时对象,您可以使用其指针并使用_p2FB-&gt; setTrail()调用进行存储。在这种情况下,临时的生命周期只到表达式的结尾。因此,指针Fireball :: _ p2_trail在setTrail调用之后无效。

答案 1 :(得分:1)

setFireBall()如果set为false,则删除_p2FB,然后在2行之后通过调用setTrail()来使用它。你正在删除指针上调用一个方法。

此外,游戏是多线程的吗?可能是一个不同的线程正在修改/删除玩家的向量,当你得到它的指针和调试器说它无效时?

答案 2 :(得分:0)

如果构造函数调用set trail,那么不要在堆栈上设置向量, 尝试将其放入堆中并传递指针。 最好使用指针与堆上的对象而不是堆栈上的对象。 如果它在堆栈上并且您尝试保存指向它的指针,则当它的作用域结束时它将被释放。