擦除std :: list项时的错误

时间:2017-11-01 00:16:55

标签: c++

这里我创建了一个列表,它是另一个列表的副本。此列表称为已复制。我正在尝试创建一个已复制的数字的洗牌列表。用户输入初始列表的大小(他们想要多少张卡),并创建一个列表,并在此处使用该列表进行洗牌。但由于某些原因,当用户输入的数字超过20时,我收到此错误:

output(41432,0x7fff7389e000) malloc: *** error for object 0x7fff55638490: 
pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

这是我的代码部分。当我删除while(!copied.empty())循环时,它工作正常,因为它将“it”值从初始列表放入新列表中的位置“r”。但我需要它为每个“r”做它。

    list<size_t> copied;
    copied.insert(copied.end(), cards.begin(), cards.end());
    int r = rand()%(((copied.size()+1) - 0) + 1) + 0;

    list<size_t>::const_iterator it = copied.begin();

    while(!copied.empty()){
        for(int i = 0; i < r; i++) {
            it++;}
        shuffle.push_back(*it);
        copied.erase(it);}

1 个答案:

答案 0 :(得分:3)

问题是copied.erase(it)使迭代器it无效,因此任何后续使用都是未定义的行为。您可以改为使用

it = copied.erase(it);
if (it == copied.end()) it = copied.begin();

因为erase在被擦除之后将有效迭代器返回到下一个元素。您还需要担心列表末尾的it++循环中的for,因此应该是:

for(int i = 0; i < r; i++) {
    if (++it == copied.end())
        it = copied.begin(); }