擦除标准::列表项时的错误
Bug when erasing std::list items
在这里我创建了一个列表,它是另一个列表的副本。此列表称为复制。我正在尝试创建一个随机的复制数字列表。用户输入初始列表的大小(他们想要多少张牌),然后创建一个列表,该列表在此处用于洗牌。但是由于某种原因,当用户输入超过 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(); }
相关文章:
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 如何防止初始值设定项列表中的错误值?
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 我将 Makefile 更改为 C++11 版本,但仍然收到列表初始值设定项错误
- 使用 C++11 时列表中出现编译错误
- 使用成员初始值设定项列表时没有匹配的函数调用错误
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 程序接收信号SIGSEGV,分段错误.C++列表
- 格式化输出以显示在错误列表的消息部分中
- 错误 - 列表节点未命名类型
- 错误:“列表”不是“std”的成员,错误:模板参数 2 无效
- 正在创建Visual Studio错误列表消息
- 打开 cpp 文件或视觉工作室 2013 最终剂量没有调试选项也没有错误列表
- 无法从QNetworkAccessManager访问Ssl错误列表
- 在QT中链接libCurl会给出一个庞大的C++错误列表
- Visual Studio 2012 c++构建失败,但错误列表或输出中没有任何内容