Re: [Vala] Invalid pointer error with manual reference handling (g_free instead of g_slice_free)



Ok,
I'm replying to myself... I found that if I replace the line

delete (void*) this;

with some more explicit memory release:

GLib.Slice.free (sizeof(Foo), (void*) this);

everything works as expected.


2010/8/26 Amos Brocco <amos brocco gmail com>

I'm implementing a compact class with manual reference handling, following
the example given in http://live.gnome.org/Vala/ReferenceHandling):

[Compact]
[CCode (ref_function = "foo_up", unref_function = "foo_down")]
public class Foo {

    public int ref_count = 1;

    public unowned Foo up () {
        ++ref_count;
        return this;
    }

    public void down () {
        if (--ref_count == 0) {
            delete (void*) this;
        }
    }

    public void method () { }
}

void main () {
    Foo foo = new Foo ();    // allocate, ref
    foo.method ();
    Foo bar = foo;           // ref
} // unref, unref => free


The program crashes when doing "delete (void*) this;" because the code is
translated to

g_free ((void*) self);

instead of a

g_slice_free (GryaFoo, self);

Is it a compiler error?

cheers

A.

Note:
this is the same problem as reported by someone on ubuntu forums
http://ubuntuforums.org/showthread.php?p=9728355... don't known if a
message was already posted here... if so, sorry for the duplication :P




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]