为什么指向向量元素的成员会导致分割错误?

Why does pointing to a vector element's member lead to segmentation fault?

本文关键字:分割 错误 成员 向量 元素 为什么      更新时间:2023-10-16

我有一个类Game和一个结构NamedGameNamedGame有两个成员变量,如下所示:

  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;
  }
}
这样,您

仍在使用指针,但您也在使用它,以便开发人员应该在取消引用之前验证GameNULL

但是,如果您只是"为了好玩"而使用指针,我建议您currentGame类型设为Game而不是Game *以避免一起使用指针。如果你走这条路,我还建议重载 Game 的赋值运算符,具体取决于你对currentGame变量做什么。