2013-11-22 34 views
0

我想實現跳過列表,我的代碼不是滿的,它需要一些更多的函數和變量,但我處於開發它的這個級別,我已經遇到了問題。
C++跳過列表實現 - 返回值已損壞,內存泄漏?

線條160和133應該給回相同的值,在這個例子中5,但不知何故,遭破壞,160返回一些奇怪的整數(我猜它訪問未分配一些內存)

我的valgrind跑了,並得到如下:

height insert 5 
b.second 5 
==9440== Conditional jump or move depends on uninitialised value(s) 
==9440== at 0x40C21BD: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C2502: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CDEBB: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CE042: std::ostream::operator<<(int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x41654D2: (below main) (libc-start.c:226) 
==9440== 
==9440== Use of uninitialised value of size 4 
==9440== at 0x40C1C53: ??? (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C21F0: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C2502: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CDEBB: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CE042: std::ostream::operator<<(int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x41654D2: (below main) (libc-start.c:226) 
==9440== 
==9440== Conditional jump or move depends on uninitialised value(s) 
==9440== at 0x40C1C5C: ??? (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C21F0: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C2502: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CDEBB: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CE042: std::ostream::operator<<(int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x41654D2: (below main) (libc-start.c:226) 
==9440== 
==9440== Conditional jump or move depends on uninitialised value(s) 
==9440== at 0x40C221A: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40C2502: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CDEBB: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x40CE042: std::ostream::operator<<(int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==9440== by 0x41654D2: (below main) (libc-start.c:226) 
==9440== 
find main 68678181 

我知道我需要刪除車的對象,但我會在PROGRAMM結束做到這一點的地方,我不認爲這是問題的原因。

如果有人能告訴我我的錯誤以及爲什麼我的變量被破壞,那將是一件好事。在adavnce

+0

你不錯過第46行的'}'嗎? – Leeor

+0

@Leeor對於這種說法?如果(高度== 0){ 不,因爲當它是空的,我不需要搜索,我需要直接插入一個元素 我不知道valgrind是否可以幫助我檢測爲什麼我的變量已損壞。 – Tonja

+0

逐行掃描您的代碼,並將您得到的結果與預期結果進行比較。例如,當'insert'完成時,你的跳過列表對象看起來像是擁有你想要的正確結構的值?你不能真正期待志願者閱讀所有(大部分未註釋的)代碼。 –

回答

0

感謝的返回值未初始化,因爲你的查找方法是遞歸的。您不會將最終通話的結果傳播回主要方法。

實際上,你的編譯器應該警告你find方法的路徑沒有返回值。例如,如果r == NULL和(* anf).down!= NULL,那麼你最終會下降到方法的結尾並且不返回任何東西。