class destruction
Q via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Sep 9 08:10:31 PDT 2015
On Wednesday, 9 September 2015 at 14:57:26 UTC, Adam D. Ruppe
wrote:
> On Wednesday, 9 September 2015 at 07:19:58 UTC, Q wrote:
>> Can I be sure that the Handle is destroyed as soon as the
>> class is destroyed?
>
> It will do that automatically.
>
> Like the others said, you won't be sure when the class is
> destroyed unless you have the user code take ownership of it.
> (This btw is the same as C++, just in C++ the ownership syntax
> is a wee bit shorter.)
>
> C++:
>
> class Foo {
> public:
> Foo() { /* acquire */ }
> ~Foo() { /* destroy */ }
> };
>
> void useFoo(Foo* foo) { }
>
> // pretend I did the header separation here
>
> int main() {
> Foo foo;
> useFoo(&foo);
> return 0;
> }
>
>
> D:
>
> --
> module foo;
>
> class Foo {
> private this() { /* acquire */ }
> ~this() { /* destroy */ }
> }
>
> struct OwnedFoo(F) {
> F foo;
> alias foo this;
> ~this() {
> .destroy(foo);
> }
>
> @disable this(this) {}
> }
>
> auto create(F, T...)(T t) if(is(F : Foo)) {
> return OwnedFoo!F(new F(t));
> }
> --
>
> --
> module main;
> import foo;
>
> void useFoo(Foo foo) {}
>
> void main() {
> auto foo = create!Foo();
> }
> ---
>
>
> The code is a bit longer since the owned pointer in the
> standard library isn't exactly what I wanted, but you could use
> std.typecons.Unique too. (Actually, it does offer a bit more
> safety in reference escaping than mine. But mine is the closest
> to C++ default).
>
>
> The private constructor means it won't let you bypass the owned
> factory when creating it. A bit extra code in foo means all
> uses of it will be simple like in main.
>
> Just don't store the reference after it is destroyed, just like
> you would need to be careful with in C++. Using the library
> Unique will help you get this right too if you want to learn
> that.
But in C++, classes and structs are value types _and_
extendable.There is no pressure to heap allocate a class. Of
course, if I do that, I use a unique_ptr (shared_ptr is almost
everytime misplaced).
But since D has a GC and (per default) force to heap allocate a
class. So IMO the GC should also destroy it, everything else is
just awkward. I don't want to hack around in a new language. I
think Rust offers my all I want. But thanks for the explanation.
More information about the Digitalmars-d-learn
mailing list