The Julia GC doesn't track immutable types, so it can't finalize them. You must use a regular type if you want it to be tracked by the GC.
On Sat, Mar 15, 2014 at 3:44 PM, Kenta Sato <[email protected]> wrote: > Thanks for your reply. > > I didn't know finalizer(), and that seemed just to be the thing I wanted. > Sadly, I couldn't use it for freeing a pointer: > > julia> finalizer(c_malloc(1024), c_free) > ERROR: objects of type Ptr{None} cannot be finalized > > > And this also wouldn't work: > > immutable SmartPointer{T} > pointer::Ptr{T} > > function SmartPointer(p::Ptr{T}) > smart_p = new(p) > finalizer(smart_p, p -> c_free(p.pointer)) > end > end > > p = SmartPointer{Uint8}(convert(Ptr{Uint8}, c_malloc(1024))) > > Am I doing something wrong? > > > On Sunday, March 16, 2014 12:12:31 AM UTC+9, Patrick O'Leary wrote: >> >> Maybe finalizer() will do what you need? http://julia.readthedocs.org/ >> en/latest/stdlib/base/#Base.finalizer >> >> On Saturday, March 15, 2014 9:49:56 AM UTC-5, Kenta Sato wrote: >>> >>> Hi everyone, >>> >>> I'm wondering if there are "smart pointers" like C++ in Julia. >>> Calling C functions often require managing raw pointers allocated in the >>> C functions. >>> After allocating a pointer, I want to wrap it up with a smart pointer, >>> which automatically frees the raw pointer when the smart pointer itself is >>> removed with a garbage collector. >>> As for pointers to an array, the `pointer_to_array` method seems to be >>> suitable in this case (http://docs.julialang.org/en/ >>> latest/stdlib/base/#Base.pointer_to_array). >>> >>> More generally speaking, I want a functionality that is something like a >>> destructor to manage resources more readily. >>> Is it possible to call a function just before a Julia object is >>> destructed? >>> >>> Thanks. >>> >>
