On Tuesday, 30 June 2015 at 13:01:46 UTC, Steven Schveighoffer wrote:
On 6/26/15 11:38 PM, Brian Schott wrote:
On Saturday, 27 June 2015 at 03:16:35 UTC, rsw0x wrote:
calling destroy on a pointer should either be fixed or be an error,
that should not be allowed to happen.

Completely agreed. Calling destroy() on a pointer has been incorrect
EVERY time I've seen it done.

I'd say if you want to see cases where it was done correctly, change the behavior and watch the complaints come in ;)

Wouldn't destroying the pointer target make an assumption about ownership?

Consider a struct that contains a pointer:

struct S
{
   T *x;
}

destroy's algorithm for this struct is to call destroy on all of the members, then set to S.init. But what if S is just *referencing* that T, and doesn't *own* it? Isn't this the wrong thing to do?

I agree it's inconsistent with class references. How to make it consistent isn't as easy to decide. For me, it's the class destruction which is incorrect. Consider that destroy is consistent with scope destruction for every type except for classes:

class C {}
struct S {}

{
   C c = new C;
   S s;
   S *s2 = new S;
} // calls s.dtor, does not call c.dtor or s2.dtor

And what about arrays? Should calling destroy on an array call destroy on all of the elements (it currently doesn't)?

If I were to design destroy from scratch, I'd make destroy, and destroyRef (which destroys referenced data via pointer or class).

-Steve

I don't think there's a problem with destroy in the first place. The problem is that it's being advertised as calling the destructors:

http://dlang.org/library/object/type_info.destroy.html
http://dlang.org/library/object/destroy.html

The function would need a documentation section itself, since it's being advertised as a replacement for `delete` and expected to do the same wherever there's something to read about it.

Reply via email to