Hi Mike,
I have modified TH1::Streamer to take into account TH1::AddDirectory flag.
The change is in CVS. With this fix, you can do:
TIter next(list);
TKey* key;
TObject* obj;
TH1::AddDirectory(kFALSE);
while ( (key = (TKey*)next()) ){
obj = key -> ReadObj(); // reads objects in from disk
objvec.push_back(obj);
}
Mike Kordosky wrote:
>
> Hi Rene,
>
> Here is my point.
>
> Say I do the following:
> {
> vector<TObject*> objvec;
> {
> TFile f("test.root");
> TList* list = f.GetListOfKeys();
>
> if(!list) return 0; // no objects in .root file
>
> TIter next(list);
> TKey* key;
> TObject* obj;
>
> while ( (key = (TKey*)next()) ){
> obj = key -> ReadObj(); // reads objects in from disk
>
> (f.GetList())->Remove(obj); //remove obj from current dir
>
> if( obj->InheritsFrom(TH1::Class()) ){// removing these lines
> ((TH1*)obj)->SetDirectory(0); // can cause a
> } // seg fault in ~TH1()
>
> objvec.push_back(obj);
>
> }
> } //TFile f out of scope here, everything ok.
> purge(objvec); // removes objects
> } //objvec out of scope here
>
> TH1 has a pointer called fDirectory. If you do
> not set this to zero, then in ~TH1() there can be a seg fault due to the
> lines:
>
> if (fDirectory) {
> if (!fDirectory->TestBit(TDirectory::kCloseDirectory))
> fDirectory->GetList()->Remove(this);
> }
>
> This comprises a rather special case, and I was wondering which are the
> other special cases. I look to the TObject class to provide the I/O
> interface, and when doing I/O I tend to manipulate objects using TObject
> member functions. For some classes, this is not enough. BTW, I did read
> the document on ownership prior to sending my comments.
>
> mike
>
> > Hi Mike,
> >
> > We posted a note at http://root.cern.ch/root/ObjectOwnership.pdf
> > as a response to several questions like yours. Please read this note.
> > I do not understand, in your case, why you want or have to make tests like
> > IsA() == TXXX::Class() ?
> >
> > Rene Brun
> >
> > Mike Kordosky wrote:
> > >
> > > Hi,
> > >
> > > I wrote to this mailing list a month or so ago about removing TObjects
> > > from a file. It was suggested that I do the following:
> > >
> > > // obj is preexisting and derived from TObject
> > >
> > > gDirectory->GetList()->Remove(obj);
> > >
> > > This does indeed remove the objects, so that when I close the file, they
> > > are not deleted. However, there is an addtional snag. If my object
> > > derives from TH1, then when ~TH1() is eventually called, it looks at
> > > TH1::fDirectory. If fDirectory != 0 , it tries to remove the object from
> > > its directory, (which doesn't exist). I know how to remove a histogram
> > > from a directory via TH1::SetDirectory(), but TH1 seems to be a very
> > > special case (along with TTree maybe?) where this is step is needed. Is
> > > there any way around this, besides lots of IsA ==
> > > TXXX::Class() statements? If not, are there other classes that have
> > > similar caveats?
> > >
> > > mike kordosky
> >
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:41 MET