C++ - 通过指针访问向量元素的安全性

C++ - Safety of accessing element of vector via pointers

在我的一个 C++ 项目中,我使用 vector 来保存一堆 struct,其中包含一些简单游戏的元素(即:井字游戏、坐标、xo 等)。即:

struct gameMove
{
  int x;
  int y;
  int player;
  int order;
};

每次在单局游戏中,每当玩家移动(即:放置 xo)时,信息通过 [= 存储在 vector 中18=],创建一个 "undo" 功能,目前按预期工作。

在我的 undo/redo 逻辑的某些部分,我正在使用遍历 vector 的函数,找到适当的元素,并 return 直接指向该元素的指针。

它是否安全,只要我正确管理 vector,访问它,将所有指向 vector 元素的指针清空,或者是否存在固有风险?我担心的是,如果扩展游戏,我打算这样做(即:对我正在开发的国际象棋游戏使用相同的代码),并且 vector 变得太大,需要自动重新-分配,指针将变得无效(即:整个列表被移动到可以容纳所有元素的新的连续块),或者是否有某种类型的智能指针接口 vector 来完成同样的事情?

谢谢。

你的担心是正确的:如果向量需要增长,vector 中的地址将会改变(或者如果向量缩小,但 vector 的大多数实现不会缩小无需程序员付出任何努力)。

立即简单的解决方案是 return 向量中的索引,而不是指针。只要它在范围内,就始终是查找特定元素的有效方法。 [而不是 NULL 你可以使用 -10xDEAD]

您是否考虑过使用 std::stackstd::list?堆栈对于简化您正在寻找的 "undo" 功能尤其有吸引力(因为最后一步将始终位于堆栈的顶部)。但是有了链接结构,你就不必太担心索引问题了,但如果你的内存紧张,它们可能不是最好的选择...