C ++跳过列表实现 - 返回值是否已损坏,内存泄漏?

时间:2013-11-22 14:32:24

标签: c++ memory-leaks corruption

我想要实现跳过列表,我的代码不完整,它需要更多的函数和变量,但我处于这个级别的开发它,我遇到了问题。

第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

我知道我需要删除Car-Objects,但我会在程序结束时的某个地方执行它,我不相信这是问题的原因。

如果有人能告诉我我的错误以及为什么我的变量被破坏会很好。

感谢adavnce

1 个答案:

答案 0 :(得分:0)

返回值未初始化,因为您的find方法是递归的。您没有将最终调用的结果传播回主方法。

实际上,您的编译器应警告您,您的find方法具有不返回值的路径。例如,如果r == NULL并且(* anf).down!= NULL,那么最终将落到方法的末尾而不返回任何内容。