Ответ 1
Циклы не плохие, но их часто избегают, потому что они могут сделать это сложным, чтобы убедиться, что у вас нет утечек памяти. Утечки возникают, особенно когда объекты "подсчет ссылок". На языке или системе, использующей подсчет ссылок, объект отслеживает количество ссылок, указывающих на него. Каждый раз, когда ссылка удаляется, счетчик уменьшается, когда счетчик становится равным нулю, ссылок нет, поэтому объект можно удалить.
Это обычно заботится о себе и работает нормально, без тщательного размышления. Если у вас есть группа объектов без циклов, и вы отбрасываете ссылку на корневой объект, тогда она будет удалена, это означает, что ссылки, которые она имеет на принадлежащие ей объекты, будут удалены, объекты, на которые делается ссылка, будут иметь свои подсчеты ссылок перейти к нулю. Они будут удалены, и каскад приведет к удалению всех объектов.
Но... если у вас есть цикл, этот каскад не работает. У вас может быть группа объектов, и вы не хотите их больше, поэтому вы бросаете единственную ссылку, которую вы имеете на эти объекты, но поскольку есть цикл, объекты ссылаются друг на друга. Это означает, что их счетчики ссылок никогда не обращаются к нулю, и они не удаляются. Это утечка памяти.
Ясно, что вы можете провести тщательное управление и разбить циклы, прежде чем отказаться от ссылки на группу объектов, которые вам больше не нужны. Но... как я только что сказал, это требует тщательного управления. Очень легко ошибиться. Это одна из основных причин утечки памяти.
Чтобы избежать риска утечек и сложной работы по правильному разбиению циклов, когда вам больше не нужна группа объектов, программисты обычно стараются избегать циклов. Это становится более важным в крупных проектах со многими программистами, где никто не понимает всю систему. Если бы были циклы, программистам приходилось следить и долго проводить изучение кода друг друга, чтобы избежать циклов.
Некоторые языки с сборщиками мусора (например, С#) могут удалить группу объектов, которые больше не нужны, даже если группа содержит циклы.