On 2010-07-14 15:43:00 -0400, Andrei Alexandrescu <[email protected]> said:

You mean class objects, right? I agree. I think it's okay to fill the object with its stateless .init members, which would assuage the issue.

That risks breaking the object's invariants. Next thing you know you'll get an assertion error in the object's invariants and will look inside your object wondering how its private state could ever have gone like that. What really happened is that somewhere far far away clear() will have been called, putting your object in an invalid state. Try to debug that!

In my opinion, if you need to clear an object's state, the object itself should be designed with that in mind (probably offering a clear() method). The object should be the one to decide if it can become zombie or not, not the user.

clear() is memory safe (unlike delete), but beyond that it doesn't look much less dangerous to use to me. I'm also doubtful it won't violate immutability in the presence of immutable members. Take a look at this problem for instance:

        class A {
                immutable int i;

                this(int i) {
                        this.i = i;
                }
        }

        A a = new A(10);
        immutable int* i = &a.i;
        assert(*i == 10);
        clear(a);
        assert(*i == 10); // i is immutable, isn't it?

Be sure to try it with a struct too.

--
Michel Fortin
[email protected]
http://michelf.com/

Reply via email to