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

我想实现跳过列表,我的代码不是满的,它需要一些更多的函数和变量,但我处于开发它的这个级别,我已经遇到了问题。
C++跳过列表实现 - 返回值已损坏,内存泄漏" title="内存泄漏">内存泄漏?

线条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

回答:

感谢的返回值未初始化,因为你的查找方法是递归的。您不会将最终通话的结果传播回主要方法。

实际上,你的编译器应该警告你find方法的路径没有返回值。例如,如果r == NULL和(* anf).down!= NULL,那么你最终会下降到方法的结尾并且不返回任何东西。

以上是 C++跳过列表实现 - 返回值已损坏,内存泄漏? 的全部内容, 来源链接: utcz.com/qa/258792.html

回到顶部