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