C++ 这是为什么? for(itemtemplateistiterator iter=item_template_list.begin();iter!=item_template_list.end();++iter){ int id=iter->first; 字符串描述=iter->second->description; 一些文件流

C++ 这是为什么? for(itemtemplateistiterator iter=item_template_list.begin();iter!=item_template_list.end();++iter){ int id=iter->first; 字符串描述=iter->second->description; 一些文件流,c++,map,iterator,C++,Map,Iterator,我来试试 当您尝试访问MyClass*(指针)时,其中一个指针有一个“垃圾”(不正确)值,并且boo-m.segfult city 如前所述,您可以将完整对象存储在映射中,而不必使用指针。很可能发生的情况是,您存储在映射中的对象指针不再有效(因为内存被释放到其他位置)。尝试访问解除分配的内存区域会导致segfault。无效表示NULL或具有所谓的“” 也可能是在另一个线程中修改映射或映射中的对象,同时在其中进行迭代 这里的代码太少,我无法为您提供更多帮助。其中一个(iter->second)=n

我来试试

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


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

很可能发生的情况是,您存储在映射中的对象指针不再有效(因为内存被释放到其他位置)。尝试访问解除分配的内存区域会导致segfault。无效表示
NULL
或具有所谓的“”

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


这里的代码太少,我无法为您提供更多帮助。

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

之所以出现segfault,可能是因为MyClass*为null或已被释放并具有垃圾值

您可以很容易地找到它是否为空:

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;

}
MyClass*obj=iter->second;
if(obj==null){

cerr为什么要存储
MyClass*
而不是
MyClass
?为什么要添加一个用代码更精确地描述的东西的英文描述!如果没有MyClass的定义,没有关于如何插入值的描述(以及为什么映射包含原始指针的描述),它也是完全无用的(谁拥有使用这些指针指向的对象(没有这些指针,我们无法确定它们的生存期)))这段代码似乎没问题,可能是segfault发生在另一个地方!@PC2st:valgrind和gdb都用iter->second->description指向那条线作为原因。@其他人,我不在我的计算机ATM机上,明天我会有更多的细节。这段代码是单线程的。我会检查它是否在任何地方被释放。Map有重要的属性th在将新元素插入映射时,不会使指向现有元素的迭代器无效。从映射中删除元素也不会使任何迭代器无效,当然,对于实际指向正在删除的元素的迭代器除外。
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;
}