c++ - C ++:在push_back时迭代指针向量时出现分段错误
问题描述
我想遍历指向对象的指针向量。在迭代时,我必须 push_back 指向向量的新指针。在循环之前,push_backs 的数量是未知的,也没有中止条件,所以我不能使用 while 循环。
这是一个使用整数指针的示例,它显示了与带有对象的版本相同的错误:Segmentation fault (core dumped) after one iteration。
vector<int*> vec;
int a = 43;
vec.push_back(&a);
for (vector<int*>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << *(*it) << " " << *it << endl;
vec.push_back(&a);
}
相同的代码但使用整数效果很好。
vector <int>vec;
int a = 43;
vec.push_back (a);
for (vector < int >::iterator it = vec.begin (); it != vec.end (); ++it){
cout << (*it) << " " << *it << endl;
vec.push_back (a);
}
解决方案
push_back
在追加结果时使迭代器无效,size > capacity
因此它重新分配并复制到新空间。
将给定的元素值附加到容器的末尾。
1) 新元素被初始化为值的副本。
2) 值被移动到新元素中。
如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。
另外,正如@Jesper 指出的那样,您正在将对局部变量的引用存储在您的vector
:
int a = 43;
vec.push_back(&a);
如果在您之前超出范围,您vector
将有悬空引用。
推荐阅读
- h2 - 为 Corda 节点打开多个 H2 控制台
- r - 基于数据框的其他列的列行连接
- r - 循环遍历多列并使用 r 中的给定范围对每列进行栅格化
- c# - 将嵌套对象从 Blazor API 返回到 WASM
- python - 如何从终端运行 google Colab Notebook?
- python - 更改图像名称 - PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用:
- python - 我的情节是空白的,我没有得到任何错误?
- python - 此错误的问题: (-215:Assertion failed) !ssize.empty() in function 'cv::resize' OpenCV
- mongodb - 更改子文档猫鼬的多个对象中的特定字段
- java - gRPC 客户端在连接到 C# 服务器时出错