2010-08-22 80 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; 
} 

不過,你仍然需要經過你的代碼用於填充列表中的其餘部分,並找出爲什麼它是你希望它是不是什麼。

總的來說我會說,除非你的目標是消除不必要的對象複製,你會更安全的將實際對象存儲在列表中,並確保你的拷貝構造函數可以處理它們。