C++ 非常复杂(对我来说)程序中的seg故障

C++ 非常复杂(对我来说)程序中的seg故障,c++,class,vector,iterator,segmentation-fault,C++,Class,Vector,Iterator,Segmentation Fault,我最近接到了我的第一个“大”编程任务。我必须设计一个扑克游戏在C++中。我已经完成了这个程序,它在使用VisualStudio编译时工作得很好,但是当我把它带到学校使用的linux服务器时,我遇到了seg故障 我已经将seg故障缩小为两个功能,一个是发布在pastebin(链接)上的,另一个在下面 void deckOfCards::replaceCards(vector<card> &replaceHand, vector<int> cardsToReplace

我最近接到了我的第一个“大”编程任务。我必须设计一个扑克游戏在C++中。我已经完成了这个程序,它在使用VisualStudio编译时工作得很好,但是当我把它带到学校使用的linux服务器时,我遇到了seg故障

我已经将seg故障缩小为两个功能,一个是发布在pastebin(链接)上的,另一个在下面

void deckOfCards::replaceCards(vector<card> &replaceHand, vector<int> cardsToReplace)
{
int removeThis;
for(int i=0;i<cardsToReplace.size();i++)
{
    replaceHand.push_back(dealCard());
}

while(cardsToReplace.size())
{
    removeThis=cardsToReplace[cardsToReplace.size()-1];//furthest index to be removed, so index      that erase needs to remove stays correct
    replaceHand.erase(replaceHand.begin()+removeThis);
    cardsToReplace.pop_back();
    }


}
void deckOfCards::replaceCards(vector&replaceHand,vector cardsToReplace)
{
内移;

对于(int i=0;i我看到您发布的代码的唯一问题是
cardsToReplace[cardsToReplace.size()]
正在访问容器边界之外的元素。这会导致未定义的行为-is可能会崩溃,它可能会失败,或者它看起来就像宇宙中一切正常一样工作。类似于
cardsToReplace[cardsToReplace.size()-1]
更合适。在访问容器之前,您需要确保检查容器的大小,以确保容器中有1个或多个元素,否则会出现相同的问题。

如果cardToReplace[i]>replaceHand.size()用于任何i,那么这可能会导致问题,因为您正在调用replaceHand.erase(replaceHand.begin()+卡片替换[i]).

您已将其缩小为两个函数,其中一个函数从未发布过?如果该函数中存在错误,该怎么办?如果尝试在www.pastebin.com上发布该函数需要很长时间,我会发布此函数,因为它们的编写方式类似,并且都会导致问题。我将它们中的每一个都注释掉,然后将它们都注释掉,如果其中任何一个称为seg出现错误,但我添加了另一个函数。
cardsToReplace[cardsToReplace.size()]
正在访问容器边界之外的元素。类似于
cardsToReplace[cardsToReplace.size()-1]
可能更合适。在像这样访问容器之前,请确保检查容器的侧面,以确保其包含1个或多个元素。
cardsToReplace[cardsToReplace.size()]
-未定义behavior@Msd1994
啊,我以前用过-1,我在测试它是否导致了问题,因为我认为它需要-1。事实证明确实如此
请理解为什么需要-1,而不仅仅是因为“它碰巧工作”才使用它。我不相信它会更小,因为使用它的函数确保cardsToReplace中的所有值都在0和4之间。传入cardsToReplace的函数使用bool检查玩家是否要移除卡,然后检查他是否要移除卡1、卡2、卡3、卡4或卡5。如果有,则传入每次测试都要移除的卡。因此选项可以是[0][1][2][3][4]、[0][1][4]、[1][4]……但不能小于0或大于4。