2010-08-22 76 views
1
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是<int, MyClass*>一个mapItemTemplateListIterator是的map<int, MyClass*>一个const_iteratorMyClass有一个名为说明公共字符串属性的类型定义。为什么这个段错误?

+1

为什么你要存储'MyClass *'而不是'MyClass'? – kennytm 2010-08-22 22:03:46

+1

为什么要在英文中添加一段用代码更精确地描述的内容的描述! – 2010-08-22 22:17:58

+0

如果没有MyClass的定义,并且没有描述如何插入值(以及描述为什么映射包含RAW指针(谁拥有指向这些指针的对象(没有这些指针,我们可以; t)不确定他们的一生))) – 2010-08-22 22:19:30

回答

2

很可能发生的事情是,您存储在映射中的对象指针不再有效(因为内存已在其他位置解除分配)。尝试访问释放的内存区域会导致段错误。无效意味着NULL或有所谓的“dangling pointer”。

也许你也在修改另一个线程中的地图或地图中的对象,同时迭代它。

这里的代码太少,我可以帮助您更多。

+1

此代码是单线程的。我会检查它是否在任何地方被释放。 – Macha 2010-08-22 22:13:21

1

我会拍摄一张照片。

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

正如所评论的,您可以将完整的对象存储在地图中,而不用担心指针。

+0

Map具有将新元素插入到地图中的重要属性不会使指向现有元素的迭代器无效。从地图擦除元素也不会使任何迭代器失效,当然,除了实际指向正在被擦除的元素的迭代器。 – JustBoo 2010-08-22 22:16:24

0

之一(iter->第二)== NULL

0

其原因,这是段错误可能是因为MyClass的*为空或已被释放,并具有垃圾值。

你可以很容易找到,如果它是空:

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

不过,你仍然需要经过你的代码用于填充列表中的其余部分,并找出为什么它是你希望它是不是什么。

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