开发者

Why does this segfault?

for(ItemTemplateListIterator iter = item_template_list.begin(); iter != item_template_list.end(); ++iter) {
    int id = iter->first;
    string de开发者_运维知识库scription = iter->second->description;
    some_file_stream << id << endl;
    some_file_stream << description << endl;

}

Where item_template_list is a map of <int, MyClass*>, ItemTemplateListIterator is a typedef for a const_iterator of map<int, MyClass*> and MyClass has a public string property called description.


What very likely happened is that the object pointers that you stored in the map are not valid anymore (because the memory was deallocated elsewhere). Attempting to access a deallocated memory area causes a segfault. Not valid is meaning either NULL or having a so-called "dangling pointer".

Maybe also you are modifying the map or objects in the map in another thread while iterating through it.

There is too little code here for me to help you more.


I'll take a shot.

One of the MyClass* (pointers) has a "junk" (incorrect) value when you try to access it and boo-m. Segfault city.

As commented, you can store the full object in the map and not bother with pointers.


one of (iter->second) == null


The reason this is segfault is probably because the MyClass* is null or has been freed and has garbage value.

You can easily find out if it's 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;
}

However, you still need to go through the rest of your code that populates the list and find out why it's not what you expected it to be.

Overall I'd say unless you're aiming to eliminate unnecessary copying of objects you'll be safer to store actual objects in the list and just make sure your copy constructor can handle them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜