Why will the delete keyword be removed?

Max Samukha spambox at d-coding.com
Thu Jul 15 05:45:03 PDT 2010


On 07/14/2010 10:43 PM, Andrei Alexandrescu wrote:

>
> There is no early failure with dangling pointers.

There is:

class A
{
     void foo() {}
}

class B : A
{
     override void foo() {}
}

A a = new B;
A a2 = a;
clear(a);
a2.foo();

If you reset the object state to .init, foo will succeed and the program 
will happily crawl on. If you zero out the object's memory, the call to 
foo will fail. I'd prefer the latter.

The same with an interface:

interface I
{
     void foo();
}

class A : I
{
     void foo() {}
}

void main()
{
     A a = new A;
     I i = a;
     clear(a);
     i.foo(); // would segfault
}

One more (rare but possible):

void bar()
{
}

class A
{
     void function() p = &bar;

     void foo()
     {
         p();
     }
}

void main()
{
     A a = new A;
     A a2 = a;
     clear(a);
     a2.foo; // would segfault
}

>
>> I'd probably want clear() to run the destructor and zero the object's
>> memory.
>
> No, because:
>
> class A
> {
> int x = -1;
> float y = 0;
> ...
> }
>
> You'd want that guy to be obliterated with the proper initializers for x
> and y.
>

Not that I fiercely disagree but ideally I'd want it to be obliterated 
to an invalid but easily recognizable state. It might help to discover 
dangling pointer errors early. Otherwise, leaving a destroyed object in 
a perfectly valid state may make debugging more fun than it needs to be.

In my world, clear() would run the dispose handlers, unset the memory 
block's BlkAttr.FINALIZE (if the object is on GC heap), call the 
object's destructor, destroy the monitor and zero the memory. I guess a 
call to rt_finalize could be used as part of this procedure.

Or something like that.


More information about the Digitalmars-d mailing list