我正在编写一个简单的游戏,并且在程序运行时跟踪他们在会话中玩的每个游戏的用户统计信息。为此,我制作了一个名为“游戏”的结构,该结构保存了玩过的游戏的统计信息(游戏编号,谁赢了,谁输了,转数为#,以及他们是否选择辞职)。然后,我对这些结构进行了动态排列,每次玩游戏的数量增加一时,该结构就会为新结构分配更多的内存部分。然后,通过运行for循环来输出所有统计信息,该for循环进行并输出该会话中玩过的每个游戏的统计信息。当输出保存游戏号码的int变量时,没有问题,但是一旦到达保存获胜者姓名的字符串变量,我将收到“细分错误(核心弃权)”错误。
我理解该错误消息表示我也尝试访问我也无权访问的内存,因此我确保动态数组的容量大于索引,因此我不会超出其内存位置,甚至在之后没有添加额外的容量每个游戏,但错误仍然存在。
我相信这部分是什么导致我尝试访问“优胜者”字符串时的错误,只是不确定原因:
for(int i = 0; i <= index; i++){
cout<<"Game "<<games[i].num<<"\t|\t"<<games[i].winner<<end;
}
这就是我制作动态数组的方式:
int index = 0;
int capacity = 1;
game *games;
games = (game *)malloc(sizeof(game)*capacity);
这就是我每次玩新游戏时如何为新游戏结构扩展数组的方式。每次游戏结束后索引会增加一个,此代码应确保容量保持等于或大于索引的大小。
if (index>=capacity) {
capacity+=1;
games = (game *) realloc(games, sizeof(game)*capacity);
}
这是结构定义
struct game
{
int num;
string winner;
};
对于任何不良的格式,我们深表歉意,我是C ++的新手,我也是该网站的新手。请很好:)
games = (game *)malloc(sizeof(game)*capacity);
games = (game *) realloc(games, sizeof(game)*capacity);
它game
包含一个名为的C ++类std::string
。这是带有构造函数和析构函数的类。
malloc()
并且realloc
是C库函数,它对任何C ++类或如何调用其构造函数或析构函数绝对一无所知。
您不能将malloc
,realloc
或free
与C ++类一起使用。不是std::string
,或其他任何非POD C ++类。
幸运的是,C ++有一个非常有用的类std::vector
,该类将正确管理“动态数组”,正确地增长和收缩以及为其内容分配内存,并正确地构造和破坏所有需要构造或破坏的东西。
您的代码重新发明了一个已经发明的轮子,称为std::vector
。它会执行所显示的代码在大小,容量等方面手动执行的所有操作。您试图复制std::vector
的逻辑,没有任何明显的好处。
彻底摆脱所有的代码,使用malloc
,realloc
和free
,并将其替换std::vector
。您将std::vector
在C ++书籍中找到有关如何使用的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句