On Mon, 09 Aug 2010 17:17:13 -0400, Andrei Alexandrescu <[email protected]> wrote:

Steven Schveighoffer wrote:
On Mon, 09 Aug 2010 16:31:39 -0400, Andrei Alexandrescu <[email protected]> wrote:
Well this is my view as well and the original intent of clear(). The problem is, if someone defined a default constructor, they presumably have a nontrivial invariant to satisfy. I'm unclear on what's the best path to take.
 Who cares about invariants when an object is destructed?

The destructor itself.

First, invariants are disabled in release mode.

I was refering to invariant in-the-large, not D's invariant keyword and associated notion.

Care to post an example? I thought you mean D invariants. Now, I don't know what you are talking about.

I also strongly suggest the destructor only be called once. Having a destructor called more than once means your destructor has to take into account that the object may be already destructed. This would be helped by the same mechanism that would make sure invariants aren't run after destruction.

If some constructor has been called in between two calls to the destructor, there's shouldn't be any danger.

No, but let's work past that.  Here are two hard requirements for clear:

1. it calls the target's destructor
2. it does not call a target's constructor.

If you can't do 2, nobody will use it. I can just as well define a reset() function on the object to do 1 without 2 (and probably do it more efficiently). I don't need any special library help for that. The user is expecting some magic stuff to happen in clear, akin to freeing the object. They are not expecting to reconstruct the object.

Here is a class which should be destructable.

class C
{
   private static C[int] instances;
   private static nextid = 0;
   private int id;
   this()
   {
      id = nextid++;
      instances[id] = this;
   }

   ~this()
   {
      instances.remove(id);
   }
}

Can we make sure instances of this object will be destroyed? Because if you keep calling the constructor, it never dies.

-Steve

Reply via email to