Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
1

Рекурсия и статические переменные.

17.09.2011, 10:46. Показов 3709. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что - то я запутался. Пытаюсь написать деструктор для своего бинарного дерева поиска, но мне не понятно поведение статических переменных. У меня не заходит в левую ветвь дерева, удаление происходит только правых элементов. Отсюда утечки памяти. Если убрать static у переменных то все правильно удаляется (выводиться, в моем примере). Я правильно понимаю то, что это не хорошо использовать в рекурсивных функциях «обычные» переменные, так как выделяется слишком много памяти под них? Помогите, пожалуйста, разобраться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class Item>
void delete_tree(Node<Item> item[])
{
    if (item != 0) {
        static Node<Item> *right, *left;
        right = item->right;
        left = item->left;
        cout << item->item << " ";
    //  delete item;
        delete_tree(right);
        delete_tree(left);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2011, 10:46
Ответы с готовыми решениями:

Статические переменные
Здравствуйте, искал инфу в интернете про статические переменные. Люди говорят разные вещи про...

статические переменные
class A { public: A(){} void f() { A::_a = this; } private: static A *_a;

Статические переменные
В чем польза использовать статические переменные вместо обыкновенных публичных в определении...

Глобальные статические переменные
Ребят, может мне кто-нибудь объяснить назначение глобальных статических переменных? Литература (в...

11
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.09.2011, 11:06 2
Удалять надо правильно (с нижних уровней):

delete_tree(right);
delete_tree(left);
delete item;

либо

delete_tree(left);
delete_tree(right);
delete item;
0
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
17.09.2011, 11:11  [ТС] 3
Цитата Сообщение от Thinker Посмотреть сообщение
Удалять надо правильно
С чего вы взяли, что у вас правильно, а у меня не правильно? Вы сначала проверяйте, что пишете, перед тем как выкладывать.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
17.09.2011, 11:15 4
Цитата Сообщение от emilen Посмотреть сообщение
С чего вы взяли, что у вас правильно, а у меня не правильно? Вы сначала проверяйте, что пишете, перед тем как выкладывать.

Не по теме:

Вообще то давно уже проверено временем...

0
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
17.09.2011, 11:24  [ТС] 5
Thinker, ваш вариант, такой же как и мой, только дерево выводиться(удаляется) немного иначе и он так же не работоспособен со статическими переменными.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.09.2011, 11:39 6
emilen, просто из любопытства: а зачем в рекурсивно вызываемой функции удаления узлов дерева статические переменные?
0
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
17.09.2011, 11:51  [ТС] 7
easybudda, потому что используя не статические переменные при большой глубине рекурсии будет выделено много памяти и возможно переполнение стека, статические переменные должны исправить эту проблему, я правильно понимаю?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
17.09.2011, 12:01 8
При первом вызове delete_tree (на верхнем уровне рекурсии), right и left присваиваются значения и после того как выполнится строка delete_tree(right); т.е. будет удаленно правое поддрево, переменная left уже не будет содержать прежнего значения и здесь: delete_tree(left); left будет указывать не на левое поддрево, а на что-то другое.
0
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
17.09.2011, 12:08  [ТС] 9
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
переменная left уже не будет содержать прежнего значения
Вот, а почему оно не будет содержать значения? Это мне и не понятно.
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
17.09.2011, 12:11 10
Цитата Сообщение от emilen Посмотреть сообщение
Вот, а почему оно не будет содержать значения? Это мне и не понятно.
Потому что переменные статические, и все рекурсивные вызовы delete_tree работают с одними и теми же переменными.
1
10 / 10 / 2
Регистрация: 25.05.2010
Сообщений: 52
17.09.2011, 12:15  [ТС] 11
Net_Wanderer, большое спасибо, наконец то до меня дошло. А можете предложить свой вариант решения проблемы? Использовать локальные переменные?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
17.09.2011, 12:39 12
Цитата Сообщение от emilen Посмотреть сообщение
Net_Wanderer, большое спасибо, наконец то до меня дошло. А можете предложить свой вариант решения проблемы? Использовать локальные переменные?
Да, вот ещё не плохая статья про деревья http://algolist.manual.ru/ds/btree.php.
1
17.09.2011, 12:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2011, 12:39
Помогаю со студенческими работами здесь

Статические переменные и функции
С какой целью применяются статические фуекции и переменные? Что они дают?

В каком сегменте хранятся статические переменные?
В каком сегменте хранятся статические переменные?

Статические переменные в классе не сохраняют заданное им значение
Мне нужно что бы несколько переменных в классе задавались конструктором класса и сохраняли свое...

Найти S слов, наиболее часто встречающиеся в тексте (использовать статические переменные)
Дан текст. Найти S слов, наиболее часто встречающиеся в тексте. Использовать статические переменные


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru