[Issue 13642] New: std.container.Array: change of length reallocates without notifying GC

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Oct 20 23:10:43 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=13642

          Issue ID: 13642
           Summary: std.container.Array: change of length reallocates
                    without notifying GC
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Phobos
          Assignee: nobody at puremagic.com
          Reporter: dlang at thedeemon.com

The Array.Payload.length setter calls realloc() when length increases, but
doesn't call GC.removeRange and GC.addRange. When data in the array contains
pointers to some managed objects, GC may collect those objects and now we have
dangling pointers in the array, which later causes Access Violations.

The following program crashes on 2.066:

module main;
import std.stdio, std.container.array, core.memory;

class C { void hi() { writeln("hi"); } }

void main(string[] argv) {
    Array!C arr;
    enum N = 10;
    //arr.reserve(N); // uncomment this and it will work fine
    arr.length = N;
    foreach(ref x; arr) x = new C;  // create N objects
    GC.collect();                   // do a GC
    arr[1].hi();                    // now this object is dead!
}

--


More information about the Digitalmars-d-bugs mailing list