class C1
{
        int a1, b1, c1, d1, e1;
        string sdb1;
        this(string s)
        {
                sdb1 = s;
                a1=90;
                b1=19;
                d1=22;
                e1=23;
        }

        ~this()
        {
                if (sdb1 == "lll")
                {
                        sdb1 = "aaa";
                }

                writeln("disposing "~sdb1);
        }
}

class C2
{
        C1 c1 = null;
        int a2, b2, c2, d2, e2;
        string sdb2;
        this(string s)
        {
                sdb2 = s;
                a2=90;
                b2=19;
                d2=22;
                e2=23;
        }

        ~this()
        {

                c1=null;
                writeln("disposing "~sdb2);
        }
};

void fn1()
{
        writeln("start of fn1");
        C2[] arr = new C2[1_000_000];
        
        for (int i=0; i<arr.length; i++)
        {
                arr[i] = new C2(text(i, " C2 class creation"));
                arr[i].c1 = new C1(text(i, " C1 class creation"));

        }
        writeln("end of fn1");
}

void main(string[] args)
{
        fn1();

        bool b = true
        while(b == true)
        {

                Thread.sleep(dur!("msecs")(5));
        }
}


This code never starts the garbage collector, but after execution fn1 nothing refers to arr. As I think, the garbage collector should start destoying of the C1 and C2 objects of arr array during the "while" cycle prosess, but this does not
happen. Dtors are not called.
If I use the manual destroying of objects C1 and C2 by "destroy" method, the dtors of C1 and C2 objects are normally called, but it can't be safe. If I use the GC.collect method after fn1, I get an error: "core.exception.InvalidMemoryOperationError@(0)".
Is this a bug of GC or I do something wrong?

Thanks.


Reply via email to