C++ - 通过指针访问向量元素的安全性
C++ - Safety of accessing element of vector via pointers
在我的一个 C++ 项目中,我使用 vector
来保存一堆 struct
,其中包含一些简单游戏的元素(即:井字游戏、坐标、x
与 o
等)。即:
struct gameMove
{
int x;
int y;
int player;
int order;
};
每次在单局游戏中,每当玩家移动(即:放置 x
或 o
)时,信息通过 [= 存储在 vector
中18=],创建一个 "undo" 功能,目前按预期工作。
在我的 undo/redo 逻辑的某些部分,我正在使用遍历 vector
的函数,找到适当的元素,并 return 直接指向该元素的指针。
它是否安全,只要我正确管理 vector
,访问它,将所有指向 vector
元素的指针清空,或者是否存在固有风险?我担心的是,如果扩展游戏,我打算这样做(即:对我正在开发的国际象棋游戏使用相同的代码),并且 vector
变得太大,需要自动重新-分配,指针将变得无效(即:整个列表被移动到可以容纳所有元素的新的连续块),或者是否有某种类型的智能指针接口 vector
来完成同样的事情?
谢谢。
你的担心是正确的:如果向量需要增长,vector
中的地址将会改变(或者如果向量缩小,但 vector
的大多数实现不会缩小无需程序员付出任何努力)。
立即简单的解决方案是 return 向量中的索引,而不是指针。只要它在范围内,就始终是查找特定元素的有效方法。 [而不是 NULL
你可以使用 -1
或 0xDEAD
]
您是否考虑过使用 std::stack
或 std::list
?堆栈对于简化您正在寻找的 "undo" 功能尤其有吸引力(因为最后一步将始终位于堆栈的顶部)。但是有了链接结构,你就不必太担心索引问题了,但如果你的内存紧张,它们可能不是最好的选择...
在我的一个 C++ 项目中,我使用 vector
来保存一堆 struct
,其中包含一些简单游戏的元素(即:井字游戏、坐标、x
与 o
等)。即:
struct gameMove
{
int x;
int y;
int player;
int order;
};
每次在单局游戏中,每当玩家移动(即:放置 x
或 o
)时,信息通过 [= 存储在 vector
中18=],创建一个 "undo" 功能,目前按预期工作。
在我的 undo/redo 逻辑的某些部分,我正在使用遍历 vector
的函数,找到适当的元素,并 return 直接指向该元素的指针。
它是否安全,只要我正确管理 vector
,访问它,将所有指向 vector
元素的指针清空,或者是否存在固有风险?我担心的是,如果扩展游戏,我打算这样做(即:对我正在开发的国际象棋游戏使用相同的代码),并且 vector
变得太大,需要自动重新-分配,指针将变得无效(即:整个列表被移动到可以容纳所有元素的新的连续块),或者是否有某种类型的智能指针接口 vector
来完成同样的事情?
谢谢。
你的担心是正确的:如果向量需要增长,vector
中的地址将会改变(或者如果向量缩小,但 vector
的大多数实现不会缩小无需程序员付出任何努力)。
立即简单的解决方案是 return 向量中的索引,而不是指针。只要它在范围内,就始终是查找特定元素的有效方法。 [而不是 NULL
你可以使用 -1
或 0xDEAD
]
您是否考虑过使用 std::stack
或 std::list
?堆栈对于简化您正在寻找的 "undo" 功能尤其有吸引力(因为最后一步将始终位于堆栈的顶部)。但是有了链接结构,你就不必太担心索引问题了,但如果你的内存紧张,它们可能不是最好的选择...