SYNOPSIS
        void destruct(object ob)

DESCRIPTION
        Completely destroy and remove object ob (if not already done so).
        After the call to destruct(), no global variables will exist any
        longer, only local ones, and arguments.

        If an object self-destructs, it will not immediately terminate
        execution. If the efun this_object() will be called by the
        destructed object, the result will be 0. Furthermore, all
        calls to other objects and to simul-efuns will be ignored, instead
        the driver will return 0 als 'call' result.

        To keep things consistent, most mudlibs frown upon the
        destruct()ion of other objects, and instead demand call_others
        to a specific lfun in the object to destruct (traditionally
        named "remove"). This will then ensure correct update of e.g.
        weights, volumes etc. Additionally or instead, the master apply
        prepare_destruct() can be used for this 'cleanup' functionality.

        The interpreter does not really destruct the object
        immediately, but marks it as deleted, removes it from the list
        of all objects, and puts it onto a list of to-be-destructed
        objects. The actual freeing occurs only when all references to
        a destructed object have gone. Thus it is possible, that an
        object occupies memory long after it has been destructed,
        although the object is not visible anywhere anymore from
        outside.

EXAMPLES
        ob->remove();
        if(ob)        /* still there, probably ob does not provide remove() */
           destruct(ob);

        This is a way of destructing an object but giving it a chance
        to do it by itself.

HISTORY
        Changed in 3.2.7 to accept destructed objects as argument, too.

SEE ALSO
        clone_object(E), remove(A), prepare_destruct(M)
