Hi,
is the memory address (seen from C++) of objects created via `@cxx
SomeClass()` (or similar) stable over time (GC cycles)?
I need to use a container class whose elements keep a pointer to the
container itself. I want Julia to own the container, so it should be
subject to garbage collection. The container owns it's elements and deletes
them on destruction, so they can't outlive the container object. But
obviously, the address of the container object must not change over time,
else things will break. So is it safe to do
container = @cxx Container()
or
container = icxx""" Container(); """
Or do I need to do something like
container = icxx""" std::unique_ptr<Container>(new Container); """
I would assume that "container.data" moves around during GC cycles, so that
`icxx""" &$container """` wouldn't be stable over GC cycles. But this
little test seems to indicate that it actually may be stable:
cxx"""
struct MyContainer {
MyContainer* m_origAddr;
MyContainer* origAddr() { return m_origAddr; }
MyContainer* currAddr() { return this; }
bool checkAddr() { return currAddr() == origAddr(); }
MyContainer() { m_origAddr = this; }
};
"""
typealias MyContainer
cxxt"MyContainer"{Int(icxx"""sizeof(MyContainer);""")}
rndarray = rand(1000,1000,100)
containers = Vector{MyContainer}()
for i in 1:20000000 push!(containers, @cxx MyContainer()) end
assert(all(x -> icxx""" $x.checkAddr(); """, containers))
rndarray = rand(10,10,10)
gc()
assert(all(x -> icxx""" $x.checkAddr(); """, containers))
Keno, help ... ? ;-)
Cheers,
Oliver