char * get_dangling_ptr() {
    char[] a;
    a.reserve(15);

    a ~= 'x';
    char *x = &a[0];

    auto a_initial_ptr = a.ptr;
    foreach (_; 0 .. 30) {
        a ~= 'y';
        //a.assumeSafeAppend() ~= 'y';
    }
    assert(a.ptr != a_initial_ptr, "a should've reallocated");

     // trying to reuse 'a's old memory
    foreach (_; 0 .. 10) {
        char[] b;
        b.reserve(15);
        foreach (__; 0 .. 15) {
            b ~= 'y';
        }
    }

    return x;
}

void main() {
    import std.stdio : writefln;
    char *x = get_dangling_ptr();
    writefln("ptr: %X; value: %s", x, *x);
}

x doesn't seem to be a dangling pointer, how come?

Reply via email to