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

时间:2017-03-20 17:06:35

标签: c++ pointers vector struct

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

  struct NamedGame {
    Game game;
    std::string name;
  };

然后我有一个vector NamedGames

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;
}

2 个答案:

答案 0 :(得分:4)

在这里,您尝试在未初始化指针currentGame时使用它:

*currentGame = games.back().game;

您必须将此行更改为:

currentGame = &(games.back().game);

答案 1 :(得分:0)

根据我的经验,seg错误几乎总是由于取消引用空指针。正如马哈茂德所指出的那样,罪魁祸首很可能是由于以下几行:

*currentGame = games.back().game;

currentGame尚未初始化的位置。存储games.back().game的引用有效,但你也应该问&#34;为什么我首先使用指针?&#34;如果您正在尝试提升性能或减少使用指针所用的空间,为什么不执行以下操作:

#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

但是,如果您仅使用指针&#34;为了好玩&#34;,我建议您将currentGame设为Game而不是Game *,以避免使用指针在一起。如果你走这条路线,我还建议重载Game的赋值运算符,具体取决于你对currentGame变量的处理方式。