Extending "scope"
Jarrett Billingsley
kb3ctd2 at yahoo.com
Sun Apr 6 06:06:20 PDT 2008
"Brian White" <bcwhite at pobox.com> wrote in message
news:fta21v$1ane$1 at digitalmars.com...
>I wrote something about "GC vs delete", but after thinking about it some
>more, how about this...
>
> There seems to be a fundamental conflict between RAII and the garbage
> collector. You can assign a new object to a "scope" variable to cause it
> to get destructed without waiting for the GC, but what about objects
> within that? For example:
>
> class tBar {
> this()
> {
> writeln("a bar has been constructed");
> }
> ~this()
> {
> writeln("a bar has been destructed");
> }
> }
>
> class tFoo {
> scope tBar bar;
>
> this()
> {
> bar = new tBar();
> writeln("a foo has been constructed");
> }
> ~this()
> {
> delete bar;
> writeln("a foo has been destructed");
> }
> }
>
> unittest {
> auto foo = new tFoo();
> }
>
>
> If you run this, you'll get:
>
> a bar has been constructed
> a foo has been constructed
>
> At some point, you _may_ also get:
>
> a bar has been destructed
> a foo has been destructed
>
>
> When it comes to RAII, that's not enough. Walter has allowed us to
> specify a class as being "scope" which requires you to create them with
> "scope auto foo = new tFoo()". However, if I also add that property to
> "tBar", it won't compile.
>
> scope class tBar {
> this()
> {
> writeln("a bar has been constructed");
> }
> ~this()
> {
> writeln("a bar has been destructed");
> }
> }
>
> scope class tFoo {
> tBar bar;
>
> this()
> {
> bar = new tBar();
> writeln("a foo has been constructed");
> }
> ~this()
> {
> delete bar;
> writeln("a foo has been destructed");
> }
> }
>
> unittest {
> scope auto foo = new tFoo();
> }
>
> $ dmd ...
> test.d(32): variable socket_test.tFoo.bar globals, statics, fields,
> manifest constants, ref and out parameters cannot be auto
> test.d(32): variable socket_test.tFoo.bar reference to scope class must be
> scope
>
> Nor can I declare a member variable "scope tBar bar" within class tFoo. In
> other words, it's not possible to embed one enforced RAII object within
> another.
>
>
> What do others think about extending "scope" to allow it to be applied to
> member data? They would by default be set to "null" but have the
> requirement that they must be set exactly once in the constructor and
> nowhere else. They would also be deleted automatically during the
> destructor.
>
> Or... Is there a different way to accomplish this?
>
> -- Brian
I think you're the 318th person to suggest this. I might be talking out of
you-know-where but I think I remember Walter mentioning that this is in the
cards for D2.
More information about the Digitalmars-d
mailing list