Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Борьба с утечкой памяти в рекурсиях 
:(
    Опции темы
Kuvaldis
Дата 27.10.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Доброго всем времени суток!!!
Столкнулся с такой неприятной проблемой
разрабатываю калькулятор для вычисления выражений на основе польской записи. Использую встроенные мной функции, что влечет многократные рекурсивные вызвовы функций, также есть список переменных и значений, которые подставляются вместо них. В связи с этим возникает огромное количество операций по работе с динамической памятью. Если все корректно вводится, то проблем (утечек) нет
Но если появляются ошибки, то хотелось бы выходить из вложенных рекурсивных функций без утечек, но это оказывается лично для меня очень сложно. Если передавать в каждую функцию один и тот же параметр-состояние, то это слишком громоздко....
Если использовать исключения, то память то все равно автоматически не чистится... В общем, я слегка в смятении...

вопрос: как в таких случаях (когда много рекурсивных вызовов) лучше всего организовывать проверки? 

Заранее благодарен за ответы... smile 

Это сообщение отредактировал(а) Kuvaldis - 27.10.2006, 22:11


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Fin
Дата 27.10.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Можно организовать что то типа одностороннего списка. Выделил память, записал в список. Убиваеш выделение, удаляеш со списка. Потом просто проверяеш, что осталось в списке и доудаляеш.  

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

Это сообщение отредактировал(а) Fin - 27.10.2006, 23:45


--------------------
Пролетал мимо.
PM MAIL   Вверх
Daevaorn
Дата 28.10.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Kuvaldis @  27.10.2006,  23:02 Найти цитируемый пост)
Если использовать исключения, то память то все равно автоматически не чистится...

Это смотря как использовать. Если применять умные указаетли, то при возникновении исключения, память будет подчищаться. Так что это самый лучший способ.

PM MAIL WWW   Вверх
maxim1000
Дата 28.10.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



можно закрыть операции выделения/освобождения памяти в объекты и использовать их
при исключении у созданных объектов отрабатывают деструкторы, так что память будет освобождена
впрочем, совсем необязательно в свои объекты - можно использовать контейнеры из STL
главное - уверенность в них, т.е. в случае своих объектов максимум простоты, чтобы вдруг никакой ошибки в них самих не случилось...


--------------------
qqq
PM WWW   Вверх
Kuvaldis
Дата 29.10.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Fin,  Daevaorn, maxim1000, 
спасибо, идеи все хорошие, красивые. Всем по репе smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Romikgy
Дата 29.10.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Kuvaldis, а зачем выделять что либо динамически? имхо проще ссылку на переменые передать


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fin
Дата 30.10.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Romikgy, Иногда нужно сохранять также и промежуточные результаты. И тут сразу напрашиваются или списки. Или заносить в Вектор.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Kuvaldis
Дата 30.10.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Romikgy, 
Цитата

а зачем выделять что либо динамически? имхо проще ссылку на переменые передать

У меня алгоритм вычисления с переменными и функциями:
Первое, что нужно сделать, это заменить все вызовы окончательными значениями + заменить переменные их числовыми аналогами. Это все закинуть в выходную строку, которая уже и будет окончательно обрабатываться при помощи парсера. Строка формируется динамически.
+ динамические переменные для формирования возможных лексем (поиск слов)
+ работа с несколькими стеками (в рекурсиях)

Твой вариант, конечно, заменчив, но к сожалению, не проходит (без кучи не обойтись)

Это сообщение отредактировал(а) Kuvaldis - 30.10.2006, 00:35


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.