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

Reply via email to