Hi,

the following coding is an extract from the DGUI library.
On my system (Win 8) I receive InvalidMemoryOperationError@.
I got the information that this Error doesn't not occur on
a WinXP system.

I think there is definetely a bug in the following coding.

The Grid class has a Collection of Rows. Each Row has a Collection
of Cols.
The class Row has a destructor which has an empty foreach over
the Collection of Cols. If I comment this empty foreach no
error is thrown. I assume the class Collection accesses a Col
object which is already destructed?

Does DMD behave correctly (InvalidMemoryOperationError) and
can where in the Collection class exactly the invalid object is
accessed? I tried to find the invalid coding line, but without success.

class Collection(T)
{
        private T[] _t;

        int add(T t)
        {
                this._t ~= t;
                return this._t.length - 1;
        }

        void clear()
        {
                this._t.length = 0;
        }

        T[] get()
        {
                return this._t;
        }

        @property int length()
        {
                return this._t.length;
        }

        T opIndex(int i) nothrow
        {
                if(i >= 0 && i < this._t.length)
                {
                        return this._t[i];
                }
                assert(false, "Index out of range");
        }

        int opApply(int delegate(ref T) dg)
        {
                int res = 0;

                if(this._t.length)
                {
                        for(int i = 0; i < this._t.length; i++)
                        {
                                res = dg(this._t[i]);

                                if(res)
                                {
                                        break;
                                }
                        }
                }
                return res;
        }
}

class Col {}

class Row
{
        private Collection!(Col) _columns;
        
        this()
        {
                this._columns = new Collection!(Col)();
        }
        
        ~this()
        {
                foreach(cp; this._columns)
                {       
                }
        }
        
        
        Col addColumn()
        {
                Col cp = new Col();
                this._columns.add(cp);
                return cp;
        }
}

class Grid
{
        private Collection!(Row) _rows;
        
        this()
        {
                this._rows = new Collection!(Row)();
        }
        
        @property public Row[] rows()
        {
                return this._rows.get();
        }
        
        Row addRow()
        {       
                Row rp = new Row();
                this._rows.add(rp);
                return rp;
        }
        
        void clear()
        {
                _rows.clear();
        }
}

void main()
{
        auto grid = new Grid();

        for(int i=0; i< 100000; i++)
        {
                grid.clear();

                with(grid.addRow())
                {
                        addColumn();
                        addColumn();
                        addColumn();
                }
        }
}

Reply via email to