为什么会出现这种错误?

时间:2010-08-22 22:00:57

标签: c++ map iterator

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*>有一个公共字符串属性称为描述。

4 个答案:

答案 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;
}

但是,您仍然需要查看填充列表的其余代码,并找出原因并不符合您的预期。

总的来说,除非你的目标是消除不必要的对象复制,否则你将更安全地将实际对象存储在列表中,并确保你的复制构造函数可以处理它们。