RE: [ROOT] Problem with TObjectTable::Delete()

From: Philippe Canal (pcanal@fnal.gov)
Date: Wed Jan 30 2002 - 19:55:15 MET


Hi Mark,

      Originally, I had called B.SetDirectory(0) in
	A's custom Streamer function, which worked, but I would prefer to use
	the automatic Streamer.

You should probably call B.SetDirectory right after the creation of B
(thus probably in A's constructor).

Cheers,
Philippe.

-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Mark Boulay
Sent: Wednesday, January 30, 2002 12:33 PM
To: Rene Brun
Cc: roottalk@pcroot.cern.ch
Subject: Re: [ROOT] Problem with TObjectTable::Delete()


Hi Rene,
	Thanks for your reply.  Adding the call B.SetDirectory(0) in A's
constructor
	does not solve the problem.  Originally, I had called B.SetDirectory(0)
in
	A's custom Streamer function, which worked, but I would prefer to use
	the automatic Streamer.

	Also, calling the static TH1::AddDirectory(kFALSE) works around the
	problem, but I'd like to keep the ability to automatically add
	histograms to the current directory.

--Mark
	
	
Rene Brun wrote:
> 
> Hi Mark,
> 
> In the constructor of class A, you should add the following statement;
>   B.SetDirectory(0);
> By definition, A owns B. However the TH1F constructor (by default) will
> add the created histogram to the list of objects in the current directory/file.
> When the file is closed, this object is deleted. You will get the object
> deleted twice.
> 
> You can also turn off the feature adding automatically the histogram objects
> to the current directory (gDirectory->GetList()) by calling the static function
>   TH1::AddDirectory(kFALSE);
> Note that if you do that, doing something like file->Write() will not
> save your histograms to the file.
> 
> Rene Brun
> 
> Mark Boulay wrote:
> >
> > Hello,
> >
> >         I have a class (call it class A), derived from TObject which has as a
> > data member a TH1F
> >         (call it TH1F B).
> >         When an object of class A is read in from file, and then the file
> > closed,
> >         a call is made to TObjectTable::Delete() deleting all objects which
> > were
> >         contained in the file.
> >         The object A is first deleted, and then an attempt is made to delete B,
> >         since a reference to it still exists in gObjectTable.  The problem
> >         is that B has presumably already been deleted along with A, since it
> >         is a data member of class A.
> >
> >         I'm using ROOT 3.02.07 under RH linux 7.2.
> >
> > Thanks in advance for assistance,
> > Mark



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET