Gee Destructors in LinkedList
- From: Stojan Dimitrovski <sdimitrovski gmail com>
- To: libgee-list gnome org
- Subject: Gee Destructors in LinkedList
- Date: Sun, 25 Jul 2010 14:31:00 +0200
Hello everyone,
Consider this situation:
using Gee;
public class Bar: Object {
~Bar() {
stdout.printf("Bar destruct.\n");
}
}
public class Foo: Object {
public Gee.LinkedList<Bar> bars { get; private set; }
public Foo() {
this.bars = new Gee.LinkedList<Bar> ();
}
~Foo() {
stdout.printf("Foo destruct: \n");
foreach (Bar bar in this.bars) {
stdout.printf("\t%u\n", bar.ref_count); // ref_count will be +1
in this block because of the local bar reference
}
stdout.printf("\n");
}
}
public static int main() {
Foo foo = new Foo();
return 0;
}
Observe that when the LinkedList has one item, then that one item's
~Bar gets called (meaning correct memory management). But if the list
has more than one item, then ~Bar doesn't get called for any item.
This to me clearly demonstrates a memory management problem, or a
forgotten unref() at ~LinkedList in Gee. This can further be tested by
manually unreffing bar in the foreach loop at ~Foo. If in the
LinkedList only one item is present, then GLib complains of a
premature unref, however if there are more than one items in the
LinkedList, and a manual unref is issued, GLib does not complain of a
premature unref and as it should each element's destructor gets
called.
I'm using Vala 0.9.1 to test this and Gee 0.5.1 on Ubuntu Lucid 32 bit.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]