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 <[email protected]>

> 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
>
>
_______________________________________________
vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to