Thanks to Mike Malamud for discovering a memory leak in CanJS. We take them super seriously so we want to get a fix in ASAP.
The problem comes from can.Model.List ability to remove destroyed model instances automatically. It does this by listening to it's instances. When they are destroyed, it gets the event and splices out the destroyed instance.
The problem is that by listening to those instances, those instances have a reference to that Model.List. Thus if you have a reference to those instances, you keep a reference to the list in memory.
The fix will be to make this behavior only happen if you bind to the list in some way. For example, if you do:
list.bind("length", function(){})
can.Model.List will setup this behavior. To undo it, call .unbind().
If you are using live-binding, it already listens to changes in the list, so you will continue to get this behavior for free.
What you need to know
If you are for some reason using a can.Model list without binding to it and expecting the "removes destroyed instances" behavior, this will not work with the next release unless you bind to the list. If you've passed your list to the template, it will be bound for you.
Thanks!