(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的主要内容,如果未能解决你的问题,请参考以下文章