从向量c++中擦除对象时出现分段错误
segmentation fault when erasing an object from a vector c++
所以当我运行这个函数时,我出现了seg错误
class vector <Record<value> >::iterator itr = records.begin();
for (; itr != records.end(); ++itr) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
}
}
其中我的向量是CCD_ 1,函数CCD_。
有人能帮我吗,我认为这样做没有问题
在删除最后一个元素的情况下,itr
将首先是records.end()
,因为这是records.erase()
将返回的内容,然后用++itr
递增。尝试:
while (itr != records.end()) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
} else {
++itr;
}
}
您不应该像那样擦除矢量元素,这不是一种有效的方法,因为在这个过程中可能会导致多次重新分配矢量。
正确且更有效的方法是使用std::erase函数。请参阅此问题以获取示例。
for (; itr != records.end(); ++itr)
保证在循环体中未修改itr
或CCD_9递减时不会转义容器并调用UB。
在这里,您正在推进迭代器:vector <Record <value> > records;
0。
当你这样做时,你不仅跳过了一个元素,你还可以跳过一个超过末尾的假想"元素",IOW你可以增量超过一个超过结尾(UB(。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?