代码之家  ›  专栏  ›  技术社区  ›  Macha

这是为什么?

  •  1
  • Macha  · 技术社区  · 14 年前
    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;
    
    }
    

    其中项目模板列表是 map 属于 <int, MyClass*> ItemTemplateListIterator 是的typedef const_iterator 属于 map<int, MyClass*> MyClass

    4 回复  |  直到 14 年前
        1
  •  2
  •   jdehaan    14 年前

    NULL 或者有一个所谓的 dangling pointer

    也可能您正在另一个线程中修改映射或映射中的对象,同时对其进行迭代。

    这里的代码太少了,我帮不了你。

        2
  •  1
  •   JustBoo    14 年前

    当您试图访问其中一个MyClass*(指针)并boo-m.Segfault city时,它有一个“垃圾”(不正确)值。

    如前所述,您可以将完整对象存储在映射中,而不必使用指针。

        3
  •  0
  •   Moisei    14 年前

    其中一个(iter->second)==null

        4
  •  0
  •   naumcho    14 年前

    这是segfault的原因可能是因为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;
    }
    

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