为什么指向向量元素的成员会导致分割错误?
Why does pointing to a vector element's member lead to segmentation fault?
我有一个类Game
和一个结构NamedGame
。 NamedGame
有两个成员变量,如下所示:
struct NamedGame {
Game game;
std::string name;
};
然后我和NamedGames
有一个vector
:
std::vector<NamedGame> games;
指针应指向当前处于活动状态的游戏:
Game *currentGame;
现在,当我尝试指向向量中的最后一个NamedGame
时,games
如下所示:
*currentGame = games.back().game;
它会导致分段错误。我做错了什么,为什么错了?我真的很感谢所有的帮助!
#include <vector>
#include <string>
struct Game {};
struct NamedGame {
Game game;
std::string name;
};
int main() {
std::vector<NamedGame> games;
Game *currentGame;
*currentGame = games.back().game;
}
在这里,您尝试在指针未初始化时尊重指针currentGame
:
*currentGame = games.back().game;
您必须将此行更改为:
currentGame = &(games.back().game);
根据我的经验,seg 错误几乎总是由于取消引用空指针。正如马哈茂德所指出的,罪魁祸首很可能是由于以下几行:
*currentGame = games.back().game;
其中currentGame
可能尚未初始化。存储games.back().game
作品的引用,但您还应该问"为什么我首先使用指针?如果您正在尝试提高性能或减少使用指针使用的空间,为什么不执行以下操作:
#include <vector>
#include <string>
struct Game {};
struct NamedGame
{
Game *game;
std::string name;
};
int main()
{
std::vector<NamedGame> games;
Game *currentGame
//Code to initialize NamedGames and push them onto games
if (NULL != games.back().game)
{
currentGame = games.back().game;
}
}
这样,您仍在使用指针,但您也在使用它,以便开发人员应该在取消引用之前验证Game
未NULL
。
但是,如果您只是"为了好玩"而使用指针,我建议您currentGame
类型设为Game
而不是Game *
以避免一起使用指针。如果你走这条路,我还建议重载 Game
的赋值运算符,具体取决于你对currentGame
变量做什么。
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误