2013-02-27 69 views
0

最近,我問了一個問題在這裏,並沒有得到一個答案,我可以用,不幸的是:GDB調試問題的STL列表

C++ STL list functions segfaulting with empty list

我一直在嘗試使用GDB調試這個問題,我有一個什麼東西意味着問題:

我宣佈一個列表,像這樣一類的成員:

std::list<Thing*> inventory; 

...然後初始化它是類(一個叫'pc'的對象)。在gdb中,我認爲這表明我有一些內存分配給它?

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

而且在,這個問題行代碼的前一行(本質上,調用 'inventory.size()' 導致段錯誤),這仍然成立:

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

...但我仍然得到段錯誤:

(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 2013-02-27 14:54:14

+0

謝謝,Dukeling,我做到了,並找到了問題的根源。仍然不知道如何解決它!這裏是: http://stackoverflow.com/questions/15133520/array-setup-in-constructor-means-failure-later-on – KHekkus 2013-02-28 10:48:51

回答

1

爲了調試內存錯誤,我建議你在Valgrind的

的valgrind --tool = MEMCHECK程序名

運行程序並解決的valgrind