Реализация списка пропуска C ++ - возвращаемое значение повреждено, утечка памяти?

0

Я хочу реализовать список пропусков, мой код не заполнен, и ему нужны еще несколько функций и переменных, но я нахожусь на этом уровне разработки, и я столкнулся с проблемами уже.

Строки 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

  • 0
    Вы не пропустили } в строке 46?
  • 0
    @ Леера за это утверждение? if (height == 0) {нет, потому что когда он пуст, мне не нужно искать, мне нужно вставить элемент напрямую. Я не знаю, может ли valgrind помочь мне определить, почему моя переменная повреждена.
Показать ещё 2 комментария
Теги:
memory-leaks
corruption

1 ответ

0
Лучший ответ

Возвращаемое значение не инициализируется, потому что метод find является рекурсивным. Вы не распространяете окончательный результат вызова до основного метода.

Фактически, ваш компилятор должен предупредить вас, что ваш метод find имеет пути, которые не возвращают значение. Например, если r == NULL и (* anf).down! = NULL, то вы, в конце концов, упадете до конца метода и ничего не вернете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню