擦除标准::列表项时的错误

Bug when erasing std::list items

本文关键字:错误 列表 标准 擦除      更新时间:2023-10-16

在这里我创建了一个列表,它是另一个列表的副本。此列表称为复制。我正在尝试创建一个随机的复制数字列表。用户输入初始列表的大小(他们想要多少张牌),然后创建一个列表,该列表在此处用于洗牌。但是由于某种原因,当用户输入超过 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);}

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

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

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

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