c++ 11在vector中引用unordered_map时出现段错误
C++11 segfault on reference to unordered_map in vector
当我运行以下代码时,我在'find()'调用上得到段错误。
#include <vector>
#include <unordered_map>
struct item {
std::unordered_map<int,int> map;
};
int main(int argc, char** argv) {
std::vector<item> stack;
stack.emplace_back();
std::unordered_map<int,int>& topmap=stack.back().map;
stack.emplace_back();
auto ind=topmap.find(5);
if(ind!=topmap.end()) {
printf("Found element five in second to top itemn");
}
}
(使用-std=c++11编译)
但是,如果第二个emplace_back()调用被删除,则没有段错误。
为什么会这样?我是否使用了错误的引用变量?向栈中添加另一个元素会使topmap失效吗?
最可能的解释是对emplace_back
的第二次调用导致重新分配,使topmap
无效。你可以很容易地通过查看stack.capacity()
来检查这一点。如果在调用之间发生了变化,则存在重新分配
如果你阅读例如这个参考,你会看到文本
如果新的
size()
大于capacity()
,则所有迭代器和引用(包括过端迭代器)无效。"
在vector的末尾添加新项通常会重新分配vector中的数据,从而导致此行为。更具体地说,由于map
是结构中的普通实例,因此它也将被重新分配。
向栈中添加另一个元素会使topmap失效吗?
不是强制性的,但是可以。这取决于在调用std::vector::emplace_back()
时是否发生了重新分配。矢量std:::: emplace_back文档:
如果new size()大于capacity(),则所有迭代器和引用(包括过端迭代器)无效。否则,只有过末端迭代器失效。
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误