SEG在非常复杂的(对我来说)程序中出错



我最近接到了我的第一个"大"编程任务。我不得不用 c++ 设计一个扑克游戏。我已经完成了这个程序,当使用Visual Studio进行编译时,它工作得很好,但是当我把它带到学校使用的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();
    }

}

这是另一个函数。http://pastebin.com/BiqJeHyR

我看到您发布的代码的唯一问题是cardsToReplace[cardsToReplace.size()]访问容器边界之外的元素。这导致了未定义的行为 - 可能会崩溃,可能会失败,或者它看起来好像宇宙中的一切都是正确的。像cardsToReplace[cardsToReplace.size() - 1]这样的东西更合适。在像这样访问容器之前,您需要确保检查容器的大小以确保它有 1 个或多个元素,否则您最终会遇到同样的问题。

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

最新更新