реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> malloc и free
Turnaev Sergey
сообщение Aug 2 2010, 11:43
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Имеется ли разница в последовательности вызовов malloc и free?

p1 = malloc(...);
p2 = malloc(...);

free(p1);
free(p2);

В программе утечек памяти нет. Все вызовы malloc-free комплементарны (проверено переопределением malloc-free)
что free не применяется дважды к одной и той же области памяти , realloc проверен на предмет применения
к левым областям памяти - всё нормально. smile3046.gif


но некоторые из завершающих free выдают ошибку разрушения кучи (heap). Что может быть не так??? unsure.gif


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 2 2010, 12:28
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата
но некоторые из завершающих free выдают ошибку разрушения кучи (heap).

Как они это выдают? Насколько я помню, то вызов free() ничего не возвращает.

Попробуйте подобный код запустить на "большом" компьютере, если будет аналогичное поведение, или например ошибка сегментации, значит что-то в программе не так.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 2 2010, 12:40
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Turnaev Sergey @ Aug 2 2010, 15:43) *
Что может быть не так??? unsure.gif

Дебажить, дебажить и ещё раз дебажить...
Я бы чисто из суеверных соображений free вызывал в обратной последовательности малоку:-)
А если серьёзно, то для Вашего примера всё должно быть едино.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Aug 2 2010, 12:47
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Turnaev Sergey @ Aug 2 2010, 15:43) *
Имеется ли разница в последовательности вызовов malloc и free?

Разницы в последовательности вызовов malloc - free нет. Важно только, чтобы malloc вызывалась перед free. Проблемы могут возникнуть если нет проверки результата выполнения malloc, т.е. функция не сумела получить доступ к запрашиваемой динамической памяти.

Модератор (rezident). В очередной раз отмечаю нарушение Вами п.3.4 Правил форума.

Сообщение отредактировал rezident - Aug 2 2010, 12:54
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Aug 2 2010, 13:12
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Функции malloc и free заставлены говорить в визуал студио путём использования выводов в стандартную консоль stdout сообщений о неправильных указателях и др.

Всем спасибо, прояснилось.

После вызова free происходит обращение на чтение или запись к удалённой области памяти - при этом, возникает программное исключение результатом которого является debug-сообщение в консоль.
Теперь надобно по адресу определить в какой строке кода происходит чтение или запись с учётом динамически изменяемого базового адреса сегмента данных... что осложняет отладку.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
Ink
сообщение Aug 3 2010, 07:18
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Если это ошибка разрушения кучи - вы пишите мимо выделенных областей, затирая служебную информацию. Но это и так ясно.
Как можно найти место: переопределяете malloc и free макросами, которые вызывают нормальные функции и тоже пишут в консоль сообщение и номер строки. После вылета увидите последнее действие, ищите где-то рядом.

А нельзя запустить прогу в дебаггере студии? Там было бы видно, что где, по call-stack.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 09:34
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Ink @ Aug 3 2010, 10:18) *
А нельзя запустить прогу в дебаггере студии? Там было бы видно, что где, по call-stack.


Лучший вариант. А есть еще такая отличная вещь : vld (Visual Leak Detector http://www.codeproject.com/KB/applications...kdetector.aspx). Он вам вообще все расскажет и покажет.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 3 2010, 10:49
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



А под GCC, подобного ничего нету?
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Aug 3 2010, 12:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Цитата(Ink @ Aug 3 2010, 14:18) *
переопределяете malloc и free макросами

Так и сделал с использованием __LINE__ и __FILE__ помимо всего прочего реализовал массив вызовов (стек) использования пар malloc-free и realloc-free.

При вызове free записывал высвобождаемый фрагмент в локальную кучку и сравнивал все фрагменты после выхода из программы - если сегмент в оригинальной памяти был повреждён (запись), то это сразу стало явным. Потом выделить нужный фрагмент кода- дело техники: точка остановки по записи в память.

Другое дело что таким способом сложно отлаживать программы, когда происходит чтение из высвобожденной памяти.

Хотя наверняка можно обыграть "переопределив" на С операцию индексирования [] функцией получения по индексу.

Но это уже скорее С++ с его ad-hoc полиморфизмом.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th June 2024 - 19:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.019 секунд с 7
ELECTRONIX ©2004-2016