LINUX.ORG.RU

malloc()


0

0

Здравствуйте. Столкнулся с непонятной проблемой - есть функция #1, которая несколько раз вызывается в прогамме. В ней выделяется память, куда записывает данные другая функция #2, потом эти данные проверятся (функция #2 вызывается из #1). Затем в #1 память освобождается через free(). Но если посмотреть а отладчике - все данные на месте.

Затем при следующем выхове #1 снова выделяет память - того же размера (память используется как буфер). И "свежая" память содержит данные, которые по идее освободились от прошлого вызова. Адрес памяти тот же.

Собственно проблема в том, что создается впечатление, что не происходит вызова функции #2 из #1, т.к. новые данные не записываеются в выделенную память. Все осложняется тем, что если выполнять прогамму в отладчике пошагова с начал функции - все ок. Если же поставить точку останова на участок после вызова #2 из #1, видно, что указатель не изменился, и в нем содержатся данные спрошлого вызова функции.

Что и где не так? Время между вызовами между функциями очень мало (доли секунды). Причем, если поставить sleep(1) между выделением и очисткой памяти (да, кстати, я заполняю выделенную память нулями, и даже после этого в отладчике показываются данные с прошлого вызова), то все ок, в буфер записываются новые данные.

Буду рад любой помощи, т.к. сам уже сообразить не могу, что я сделал не так.

anonymous

Ищи ошибки в своей программе. Кроме отладчика можно насувать везде printf() (до и после вызова #2). То что после free() функция malloc() возвращает этот же указатель, нормально. malloc() это библиотечная функция, которая если надо просит память у ядра, а если память уже есть (free() не обязательно означает "отдать память ядру") то дает эту память.

mky ★★★★★
()

Вообще, по моему опяту, самое сложное - это смириться с тем, что программа работает как и должна. Может и здесь та же проблема? Я так и не понял в чем ошибка? Если выделить блок размером, ну например, 16Kb, затем его освободить и тут же выделить еще рад блок того же размера, то совпадение их адресов - это только хорошо. Это это скорее всего значит, что хорошо работает кэширование, и второй вызов malloc наверняка прошел на порядок быстрее, чем первый. Просто хорошая реализация malloc.

В чем проблема то? А то, что данные не пропадают после того, как блок освобождается - опять не вижу проблем. Скорее всего, страницы памяти в которых они располагались еще не были возвращены системе и их никто не успел затереть.

В чем проболема то? Программа вылетает в segfault? Или данные в буфере оказываются не те, что должны?

devinull ★★
()
Ответ на: комментарий от devinull

Если честно, мне глубоко пофигу как malloc() выделяет память. Просто я описал это здесь для того, чтобы дать общую карттину как у меня выделяется память.

>Собственно проблема в том, что создается впечатление, что не происходит вызова функции #2 из #1, т.к. новые данные не записываеются в выделенную память. Все осложняется тем, что если выполнять прогамму в отладчике пошагова с начал функции - все ок. Если же поставить точку останова на участок после вызова #2 из #1, видно, что указатель не изменился, и в нем содержатся данные спрошлого вызова функции.

Опишу более детально: при первом вызове функции #1, она получает через функцию #2 ответ сервера (сетевое приложение это). При втором вызове, отвечает серверу. При третьем, снова получает ответ сервера. И т.д.

Проблема в том, что при третьем вызове #1 в ответе сервра почему то оказывается строка, которую получили от сервера при первом вызове.

Как я писал раньше, если делать в отладчике пошагово, или поставть sleep(1) в третьем вызове #1 между выделением нового буфера и вызовом #2 - то все работает как надо.

anonymous
()
Ответ на: комментарий от vnp

Точно, чудес не бывает. Дело было в #2, данные еще не приходили на момент вызова. Потому в gdb и работало. В общем все равно спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.