On 2010-04-04 09:45:36 -0400, dsimcha <[email protected]> said:
== Quote from Michel Fortin ([email protected])'s article
Question: if the container's memory isn't garbage-collected, how do you
implement iterators, eh, ranges so that they are still memory-safe?
The way I'm picturing this being implemented is that a GC'd class
instance exists
at the top level, and then the internal implementation-detail storage that the
class uses is implemented via malloc and free. This storage would get freed in
the class finalizer when the instance is GC'd. In this case all you'd
need to do
is make the range hold a reference to the class instance so it wouldn't
be GC'd.
That wouldn't work with realloc: realloc copies to a new location then
frees the old memory if it cannot expand in place. You can't keep the
old copy allocated.
I've been thinking of another method to ensure safety: don't allow
expanding a container as long as there are ranges pointing to it.
Easily implemented with a reference count. For instance, if you have a
vector container, expanding the container would invalidate ranges.
Instead of allowing ranges to become invalid and potentially dangerous,
just disallow expanding the container. The range would contain a
pointer to its upper and lower bound, and a pointer to the container to
increment the reference count when it's copied and decrement it when
it's destroyed.
--
Michel Fortin
[email protected]
http://michelf.com/