import std.stdio; struct shared_ptr(T) if (is(T == class)) { uint n; T p; alias p this; this(T p) { n++; this.p = p; writeln("construct, ", n); } this(this) { n++; writeln("reference copy, ", n); } ~this() { n--; if (n==0) { delete p; writeln("delete"); } else writeln("destruct, ", n); } } class A { void f(){writeln("hoge");} } void g(shared_ptr!A p) { p.f(); } void main() { writeln("[1"); { writeln("[2"); auto x = shared_ptr!A(new A); { writeln("[3"); auto y = x; { writeln("[4"); g(y); writeln("]4"); } writeln("]3"); } g(x); writeln("]2"); } writeln("]1"); }
[1 [2 construct, 1 [3 reference copy, 2 [4 reference copy, 3 hoge destruct, 2 ]4 ]3 destruct, 1 reference copy, 2 hoge destruct, 1 ]2 delete ]1
うーん? こういうことか?
C++の奴は仮想関数の呼び出しとかでもごもごしてた気がする.