![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Доброго всем времени суток!!!
Столкнулся с такой неприятной проблемой разрабатываю калькулятор для вычисления выражений на основе польской записи. Использую встроенные мной функции, что влечет многократные рекурсивные вызвовы функций, также есть список переменных и значений, которые подставляются вместо них. В связи с этим возникает огромное количество операций по работе с динамической памятью. Если все корректно вводится, то проблем (утечек) нет Но если появляются ошибки, то хотелось бы выходить из вложенных рекурсивных функций без утечек, но это оказывается лично для меня очень сложно. Если передавать в каждую функцию один и тот же параметр-состояние, то это слишком громоздко.... Если использовать исключения, то память то все равно автоматически не чистится... В общем, я слегка в смятении... вопрос: как в таких случаях (когда много рекурсивных вызовов) лучше всего организовывать проверки? Заранее благодарен за ответы... Это сообщение отредактировал(а) Kuvaldis - 27.10.2006, 22:11 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Можно организовать что то типа одностороннего списка. Выделил память, записал в список. Убиваеш выделение, удаляеш со списка. Потом просто проверяеш, что осталось в списке и доудаляеш.
А лучший способ, сделать программу так, чтобы даже в ошибочном состоянии удалять выделенную память перед выходом из функции. Это сообщение отредактировал(а) Fin - 27.10.2006, 23:45 -------------------- Пролетал мимо. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно закрыть операции выделения/освобождения памяти в объекты и использовать их
при исключении у созданных объектов отрабатывают деструкторы, так что память будет освобождена впрочем, совсем необязательно в свои объекты - можно использовать контейнеры из STL главное - уверенность в них, т.е. в случае своих объектов максимум простоты, чтобы вдруг никакой ошибки в них самих не случилось... -------------------- qqq |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Fin, Daevaorn, maxim1000,
спасибо, идеи все хорошие, красивые. Всем по репе -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
Kuvaldis, а зачем выделять что либо динамически? имхо проще ссылку на переменые передать
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Romikgy, Иногда нужно сохранять также и промежуточные результаты. И тут сразу напрашиваются или списки. Или заносить в Вектор.
-------------------- Пролетал мимо. |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Romikgy,
У меня алгоритм вычисления с переменными и функциями: Первое, что нужно сделать, это заменить все вызовы окончательными значениями + заменить переменные их числовыми аналогами. Это все закинуть в выходную строку, которая уже и будет окончательно обрабатываться при помощи парсера. Строка формируется динамически. + динамические переменные для формирования возможных лексем (поиск слов) + работа с несколькими стеками (в рекурсиях) Твой вариант, конечно, заменчив, но к сожалению, не проходит (без кучи не обойтись) Это сообщение отредактировал(а) Kuvaldis - 30.10.2006, 00:35 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |