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