Re: illegal instruction when quitting root

Rene Brun (Rene.Brun@cern.ch)
Thu, 27 Aug 1998 08:37:30 +0200


meb@gorby.dataventures.com wrote:
>
> Dear Roottalk,
>
> I have a user class (ItemMap) that is derived from the root class
> TNamed. I have one annoying problem that I can't fix. I have tried to
> follow the philosopy that 1) default contructors do not allocate
> memory, and 2) the destructor is protected in cases where only the
> default contructor was called. This hasn't helped.
>
> Example: If I use an ItemMap stored in a root file, I can't quit root
> without causing a "*** Break *** illegal instruction" UNLESS I do
> either III.a or III.b below:
>
> I. open a rootfile with an ItemMap
> II. use the ItemMap
> III.
> {
> a. delete the ItemMap object in memory, or
> b. close the rootfile
> }
> IV. quit root
>
> I think that it has something to do with TNamed (previously my ItemMap
> was derived from TObject). Any hints?
>
> - Mike Beddo

>root [3] map->Dump()
>*fItemTable ->205864d8
>*fCategoryTable ->20e7eca8
>*fDirectory ->204fcc78 !
>fName.*fData ItemMap
>fTitle.*fData BCF ItemMap

Hi Mike,
>From the map->Dump() info, I see that you have a pointer fDirectory.
My assumption is that you are probably inserting all the objects
in your map in the current directory/file in the objects constructors.
If this is the case, you must be careful that when you close the file
or delete the file/directory, the Root directory destructor
deletes all the objects inserted in the directory.
If you delete your objects before closing the directory, you
must also remove these objects from the directory (see for
example the TH1 constructors/destructor, otherwise your objects
will be deleted twice!
It is strongly recommended to insert in a directory only objects
created via the new operator to avoid the problem of objects
deleted when leaving the current scope, unless you protect
the object destructor for the fDirectory.
I suggest you add a simple print in your object destructors
to see what is happening.

Rene Brun