2013-02-27 3 views
0

Недавно я задал вопрос здесь, и не получил ответа, я мог бы использовать, к сожалению:GDB и отладки проблем с списком STL

C++ STL list functions segfaulting with empty list

Я пытался использовать GDB для отладки вопрос, и у меня есть вопрос о том, что означает что-то:

я объявляю список в качестве члена класса, как так:

std::list<Thing*> inventory; 

..., а затем создать экземпляр класса это in (объект, называемый «pc»). В gdb, я полагаю, это показывает, что у меня есть память, выделенная для него?

(gdb) p &pc.inventory 
$7 = (std::list<Thing*, std::allocator<Thing*> > *) 0xbffff22c 

Далее в, одна линия до проблемной строки кода (в сущности, называя 'inventory.size()' вызывает Segfault), это по-прежнему имеет место

(gdb) p &inventory 
$8 = (std::list<Thing*, std::allocator<Thing*> > *) 0xbffff22c 

... однако я все еще получаю Segfault:

(gdb) n 
558 if (inventory.size() == 52) { 
(gdb) n 

Program received signal SIGSEGV, Segmentation fault. 
0x0804e3fe in std::_List_const_iterator<Thing*>::operator++ (this=0xbfff94e0) 
at /usr/include/c++/4.4/bits/stl_list.h:223 
223  _M_node = _M_node->_M_next; 

Мой вопрос essentialy это: Конечно, если у меня есть адрес в списке пользователей, список существует, и я должен быть в состоянии использовать размер() на нем ?? Если нет, почему бы и нет? И как я могу отлаживать?

Спасибо всем!

+1

Просто потому, что что-то есть неправильный адрес не означает, что это действительный адрес. C++ не устанавливает указатели на нуль при инициализации или недействительности, он просто использует то, что находится в памяти в то время. Из того, что вы показали, это может быть проблемой. Постройте минимальный тестовый пример, который воспроизводит проблему, и мы сможем помочь. – Dukeling

+0

Спасибо, Дюкелинг, я сделал это и нашел корень проблемы. Тем не менее, не знаю, как это исправить! Вот он: http://stackoverflow.com/questions/15133520/array-setup-in-constructor-means-failure-later-on – KHekkus

ответ

1

Для отладки ошибок памяти я предлагаю вам запустить программу в Valgrind

Valgrind --tool = MemCheck program_name

и исправить все ошибки указывали на Valgrind

Смежные вопросы