(C++) 在同一个类中调用时,取消引用的指针返回正确的值,从 main 调用时返回 0

Posted

技术标签:

【中文标题】(C++) 在同一个类中调用时,取消引用的指针返回正确的值,从 main 调用时返回 0【英文标题】:(C++) Dereferenced pointer returns correct value when called within same class, and 0 when called from main 【发布时间】:2017-03-09 22:20:33 【问题描述】:

我正在尝试对一些使用的对象进行定期快照。为此,我使用 TakeSnapshot() 方法,其工作原理如下:

    调用 TakeSnapshot() 的游戏管理器有一个指向我要保存的对象的指针列表 (std::list objects;) 它遍历指针,取消引用它们并创建一个新的 Object复制我感兴趣的值的相同类型。

    复制后,将新对象推送到向量上并创建新的 GameState 对象(游戏状态是“快照”)。

    然后它将向量存储在新的 GameState 对象中,并将 GameState 对象推送到游戏状态队列中,如果队列的大小超过某个预定数量,它将以 FIFO 方式丢弃。

我遇到的问题是,为了以后的游戏计算,我需要一个指向游戏最新快照的工作指针。我试图将它存储在公共 GameState* 中,但是当我从 Main 函数中取消引用它时,它不会返回正确的值(?)。但是如果我尝试在 TakeSnapshot() 中取消引用它,它会返回正确的值

FPS.cpp

// FPS.cpp : Defines the entry point for the console application.

class GameState 
    public:
        std::vector<Object> objects;
;

class GameManager      
    public:
        int tick = 0;
        int tickrate = 150;
        int memorySize = tickrate;

        std::list<Object*> objects;
        std::queue<GameState> snapshots;

        GameState * latestSnapshot;

    void AddObject(Object* object) 
        objects.push_back(object);
    

    void TakeSnapshot() 
        GameState snapshot;
        std::vector<Object> objectsCopy;
        std::list<Object*>::const_iterator it;
        for (it = objects.begin(); it != objects.end(); ++it) 
            Object copyObject;
            copyObject.position = (*it)->position;
            objectsCopy.push_back(copyObject);
        

        snapshot.objects = objectsCopy;

        latestSnapshot = &snapshot;
        snapshots.push(snapshot);
        if (snapshots.size() > memorySize) 
            snapshots.pop();
        
        cout << (*latestSnapshot).objects.size() << endl; // <--- RETURNS 2 
    
;



int main()
    GameManager gameManager;

    Object player;
    Object player2;
    player.position = Vector(154, 0, 0);

    gameManager.AddObject(&player);
    gameManager.AddObject(&player2);

    GameState latestSnapshot = *gameManager.latestSnapshot;
    cout << latestSnapshot.objects.size() << endl;// <--- RETURNS 0 

编辑只留下代码的相关部分。

【问题讨论】:

欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。 能否请您删除所有不相关的代码并将其缩小到重现问题的minimal reproducible example? 在您的函数TakeSnapshot() 上,变量GameState snapshot 在函数结束时被销毁。然后指针latestSnapshot 不再指向有效对象。当您通过GameState latestSnapshot = *gameManager.latestSnapshot 在主函数上调用它时,latestSnapshot 指向的对象不再存在(位于堆栈上)。 哦,我明白了,所以我必须让指针指向队列中的最后一个值? 【参考方案1】:

正如@tesseractBird 所说,错误是因为指针指向一个被破坏的对象,使其指向我添加到队列中的最后一个值解决了问题。

【讨论】:

以上是关于(C++) 在同一个类中调用时,取消引用的指针返回正确的值,从 main 调用时返回 0的主要内容,如果未能解决你的问题,请参考以下文章

取消引用从线程原因返回的指针;分段错误:11 [重复]

通过取消引用 NULL 指针来分配引用

C++ 类设计总结回顾------this指针

返回对本地取消引用的指针的引用

C++:取消引用指针

C++多态总结