for(ItemTemplateListIterator iter = item_template_list.begin(); iter != item_template_list.end(); ++iter) {
int id = iter->first;
string description = iter->second->description;
some_file_stream << id << endl;
some_file_stream << description << endl;
}
如果item_template_list是map
的{{1}},则<int, MyClass*>
是ItemTemplateListIterator
const_iterator
的typedef,map<int, MyClass*>
有一个公共字符串属性称为描述。
答案 0 :(得分:2)
很可能发生的是,您存储在地图中的对象指针不再有效(因为内存已在其他地方释放)。尝试访问已释放的内存区域会导致段错误。无效是指NULL
或具有所谓的“dangling pointer”。
也许你在迭代它时在另一个线程中修改地图中的地图或对象。
这里的代码太少,无法帮助你。
答案 1 :(得分:1)
我会开枪。
当您尝试访问它并且boo-m时,其中一个MyClass *(指针)有一个“垃圾”(不正确)值。 Segfault城市。
如评论所示,您可以将完整对象存储在地图中,而不必使用指针。
答案 2 :(得分:0)
其中一个(iter-&gt; second)== null
答案 3 :(得分:0)
这是段错误的原因可能是因为MyClass *为null或已被释放且具有垃圾值。
您可以轻松找出它是否为空:
MyClass * obj = iter->second;
if (obj == null) {
cerr << "Unexpected null pointer" << endl;
} else {
string description = obj->description;
some_file_stream << id << endl;
some_file_stream << description << endl;
}
但是,您仍然需要查看填充列表的其余代码,并找出原因并不符合您的预期。
总的来说,除非你的目标是消除不必要的对象复制,否则你将更安全地将实际对象存储在列表中,并确保你的复制构造函数可以处理它们。