C++跳过列表实现-返回的值已损坏,内存泄漏
C++ skip list implementation - returned value is corrupted, memory leak?
我想实现跳过列表,我的代码还不够满,它需要更多的函数和变量,但我正处于开发它的这个级别,我已经遇到了问题
行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
返回值未初始化,因为find方法是递归的。您没有将最终调用的结果传播回主方法。
事实上,编译器应该警告您,find方法的路径不返回值。例如,如果r==NULL和(*anf).down=如果为NULL,那么您最终会掉到方法的末尾,并且不会返回任何内容。
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 变量周围的堆栈'folderPath'已损坏
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- AES-128 CFB-8解密的前16个字节已损坏
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 尝试读取或写入受保护的内存.这通常表示其他内存已损坏.在C++Dll中
- C++跳过列表实现-返回的值已损坏,内存泄漏
- 已尝试读取或写入受保护的内存.这通常表示其他内存已损坏 DllImport
- C++.NET包装程序:试图读取或写入受保护的内存.这通常表示其他内存已损坏
- 附加信息:试图读取或写入受保护的内存.这通常表明其他内存已损坏
- 试图读写受保护的内存.这通常表明其他内存已损坏