Ошибки памяти C++ при выходе из программы

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

*** glibc detected *** ./sll_client: free(): invalid next size (fast): 0x0000000000787720 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7f9e9cbb5a8f]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7f9e9cbb98e3]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x39)[0x7f9e9d409019]

======= Memory map: ========

7f9e9d893000-7f9e9d895000 rw-p 00021000 07:00 7473                       /lib/x86_64-linux-    gnu/ld-2.13.so
7fff68119000-7fff6813a000 rw-p 00000000 00:00 0                          [stack]
7fff68167000-7fff68168000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

Конкретная ошибка "glibc" почти каждый раз разная.

Я уже запускал приложение через Valgrind и утечек памяти почти не обнаружено. Те, что есть, проблем не вызывают. Есть ли общая причина этой проблемы? Я мог бы опубликовать код, но это более трех тысяч строк на C++, и эта проблема возникает впервые за три недели.

Вывод Valgrind

Вывод GDB


person XBigTK13X    schedule 07.05.2011    source источник
comment
Сообщает ли valgrind о каких-либо других проблемах, кроме утечек памяти?   -  person Fred Larson    schedule 07.05.2011
comment
Я скажу, что он закончил работать нормально... теперь он явно работает неправильно.   -  person Ben Voigt    schedule 07.05.2011
comment
@Fred: я добавил ссылку на журнал от Valgrind   -  person XBigTK13X    schedule 07.05.2011
comment
@Ben: Действительно, но он все еще делает все, что я хочу. Единственная проблема в том, что он выплевывает эти дополнительные сообщения после выполнения своей работы :).   -  person XBigTK13X    schedule 07.05.2011
comment
На самом деле у меня нет такого большого опыта чтения вывода valgrind, но я вижу некоторые недопустимые сообщения чтения и записи. Я бы посмотрел RCFour.cpp, строки 71-72. Я подозреваю, что у вас там плохой указатель или что-то в этом роде.   -  person Fred Larson    schedule 07.05.2011


Ответы (2)


Недопустимые записи размера 4 почти наверняка являются причиной вашей проблемы. Вы топаете память, которой не владеете, скорее всего, непосредственно перед или сразу после области памяти, которая была динамически выделена.

Недопустимые чтения размера 4 тоже проблематичны, но не вызывают того вывода, который вы получаете. Хоть их исправляй. :-)

Ошибки памяти могут быть огромной проблемой, потому что их последствия могут проявляться далеко от того места, где на самом деле возникла проблема. Это часть того, для чего предназначены такие инструменты, как Valgrind. Обнаружение утечки памяти на самом деле является второстепенной функцией.

person Omnifarious    schedule 07.05.2011
comment
Эти ошибки указывают на места, где я вызываю std::swap. Он вызывается для заполненного вектора, и индексы действительны. Почему это может вызвать проблему? - person XBigTK13X; 07.05.2011
comment
@XBigTK12X: Это очень странно. Я не знаю, почему это было бы так. Имеют ли меняемые значения собственные конструкторы копирования и/или операторы присваивания? - person Omnifarious; 07.05.2011
comment
Обмен вызывается для двух элементов в std::vector‹int›. - person XBigTK13X; 07.05.2011
comment
@XBigTK13X: Что-то вроде этого: ::std::swap(v[x], v[y])? Вы уверены, что x и y всегда меньше v.size()? Возможно, один из них окажется за пределами конца вектора. Тот факт, что недопустимые операции чтения и записи имеют размер ровно 4 байта, имел бы большой смысл, поскольку именно такой размер имеет int. - person Omnifarious; 07.05.2011
comment
Границы вектора действительны, я тестировал различные случаи и всегда получал правильный результат. - person XBigTK13X; 07.05.2011
comment
@ XBigTK13X: получение корректного вывода — это не тест. Перед вызовом ::std::swap введите assert(x < v.size() && y < v.size());. Конечно, не используйте там x и y, но любое выражение, которое вы используете в своем вызове подкачки. - person Omnifarious; 07.05.2011
comment
@ XBigTK13X: Были ли у вас ошибки утверждения? - person Omnifarious; 07.05.2011

Отследили ли вы основную причину сообщения Invalid read of size 4, которое продолжает появляться в ваших журналах valgrind??
Эти недопустимые чтения являются основной причиной вашей проблемы.

person Alok Save    schedule 07.05.2011
comment
Это происходит, когда я вызываю std::swap для двух элементов в векторе. Любая идея, почему это может вызвать проблему? - person XBigTK13X; 07.05.2011