On Monday, 28 March 2016 at 21:24:48 UTC, Adam D. Ruppe wrote:
If it didn't give the error, either you swallowed it or you didn't actually dereference null.

Okay, so it's not actually supposed to happen. Hopefully it's something I did wrong...

What is the db library you are using? Did you compile it along with your program or use a .lib with it?

d2sqlite3: https://github.com/biozic/d2sqlite3

Compiled it along with my program. And "Database.prepare" is neither static, nor final. I keep describing it wrong though, what I ended up doing. It's easier to just write a program to describe it. What I ended up doing was like this:

struct Database {
  string derp;
  Statement prepare(string s) {
        return Statement(1234);
  }
}

struct Statement {
  int member;
  void bind(int column, int value) {
        import std.stdio;
        writeln("derp",member);
  }

}


class Wrapper {
  Database something;
  Statement prep;
  this() {
    something = Database("...");
    prep = something.prepare("...");
  }
}

Wrapper oops;
void initialize() {
  oops = new Wrapper();
}

class Entry {
  Wrapper parent;
  this(Wrapper parent) {
    //this.parent = parent;
    //oops
    parent = parent;
  }
  void usefulmethod() {
    parent.prep.bind(1,42);
    //parent.prep.execute();
    //parent.prep.reset();
  }
}

void main() {
  initialize();
  auto entry = new Entry(oops);
  entry.usefulmethod();
}

That program causes a segmentation fault on my machine. Somehow despite never initializing Entry.parent, a class object (whose default init is a null pointer), I can still call methods on it, access members on it, and call methods on those members. No warnings or errors. The segfault doesn't happen until the bind() method.

Reply via email to