Solution (source code)

= Solution

Constructing channel implementations, decorators and adapters allocates <software objects> that hold state and references to other <software objects>. As configurations and temporary processing chains are replaced, some old <software objects> become unreachable. A typical <Scala> program on a managed runtime relies on <garbage collection> to recycle that storage; otherwise unreclaimed allocation can exhaust the available <heap memory>.

\b[A reachable wrapper keeps its wrapped component reachable.] Sharing a channel among several wrappers can extend its lifetime until all relevant references disappear. Many <software objects> alone do not imply that collection can free them: if the program deliberately retains every channel, those <software objects> remain live. The reason <garbage collection> is useful is repeated allocation combined with changing reachability, not an assumption that the integer-returning `apply` operation allocates a fresh channel on every call.