25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
|
|||||||||||
1 | |||||||||||
Утечка памяти при рекурсии29.05.2015, 10:10. Показов 2563. Ответов 10
Метки нет Все метки)
(
Здравствуйте. Столкнулся ч тем, что я, похоже, неправильно составил алгоритм рекурсии. При запуске получаю ошибку связанную с памятью. Ошибка: Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 130968 bytes)
Код:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
29.05.2015, 10:10 | |
Ответы с готовыми решениями:
10
Утечка памяти Утечка памяти в PHP Утечка памяти при ping'e... |
![]() 5502 / 3971 / 1417
Регистрация: 06.01.2011
Сообщений: 10,938
|
|
29.05.2015, 10:16 | 2 |
А зачем такая функция?
0
|
25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
|
|
29.05.2015, 10:28 [ТС] | 3 |
Если логин сгенерированный системой из имени и фамилии пользователя уже существует, то она изменяет алгоритм подбора логина.
т.е. изначально логин равен 1 буквы имени.фамилия Если такой логин уже есть, то функция должна пойти вновь и взять уже 2буквы имени.фамилия. Ну и так далее. Только надо еще предусмотреть, если в имени букв не осталось, но это я допишу. Что скажете?
0
|
![]() 5502 / 3971 / 1417
Регистрация: 06.01.2011
Сообщений: 10,938
|
||||||
29.05.2015, 10:36 | 4 | |||||
Вообще не представляю, зачем такое может понадобиться.
![]() А чтобы не было утечки, попробуйте так:
А ещё может быть проблема в writeErrors.
0
|
25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
|
|||||||||||
29.05.2015, 11:41 [ТС] | 5 | ||||||||||
Не помогло, увы.
writeErrors только и делает, что ставит куку и редиректит на нужную страницу. Да и по идее, writeErrors вообще не должен вызываться т.к. проблем с запросом не должно быть. Щас проверю, что возвращает запрос. Быть может это я накосячил. Добавлено через 28 минут Вот так утечки памяти нет. Только логин приходит пустой из функции ![]()
Если кому интересно - решение так и не нашел. Поэтому ушел от рекурсии в сторону цикла:
1
|
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
|
|
29.05.2015, 11:49 | 6 |
0
|
![]() 5502 / 3971 / 1417
Регистрация: 06.01.2011
Сообщений: 10,938
|
|
29.05.2015, 12:02 | 7 |
0
|
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
|
||||||
29.05.2015, 12:20 | 8 | |||||
Всё изменится. Инкрементить в рекурсивных вызовах крайне нежелательно потому как во-первых при обратом возврате в функцию значение переменной уже другое (т.е. надо очень хорошо понимать где это возможно), во-вторых в данном случае значение в следующий рекурсивный вызов передается то же что и было, что и вызывает переполнение. Попробуй запустить
0
|
![]() 5502 / 3971 / 1417
Регистрация: 06.01.2011
Сообщений: 10,938
|
|
29.05.2015, 12:42 | 9 |
Блин, точно. Что-то я... Тогда нужно использовать предварительное увеличение (prefix increment).
0
|
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
|
|
29.05.2015, 12:47 | 10 |
а еще лучше раз и навсегда отучить себя использовать инкремент/декремент в рекурсивных функциях.
0
|
![]() 5502 / 3971 / 1417
Регистрация: 06.01.2011
Сообщений: 10,938
|
|
29.05.2015, 13:05 | 11 |
Разницы нет, что префиксный инкремент, что "вручную" добавлять единицу. Сработает одинаково. Главное использовать правильно, а не так, как изначально было (постфиксный инкремент).
0
|
29.05.2015, 13:05 | |
Помогаю со студенческими работами здесь
11
Утечка памяти при рисование GUI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |