Re: [ROOT] Warning file not closed or root crash when deleting file

From: Rene Brun (brun@pcbrun.cern.ch)
Date: Sun Jun 20 2004 - 18:48:54 MEST


Hi Christian,

Before calling AddFriend, you must close atree and fFile.
Do:

   TString tname = atree->GetName()
   TString fname = fFile->GetName()
   atree->Write();
   delete fFile;
   fTree->AddFriend(tname,fname);

or  call the other TTree::AddFriend constructor
   atree->Write();
   fTree->AddFriend(atree);

Rene Brun

On Sun, 20 Jun 
2004, cstrato wrote:

> Dear Rooters
> 
> I have the following situation:
> First I open an existing file "fDataFile" which contains some data 
> trees. In a first step I add these trees as friends to a tree "fTree".
> Then I create a new file "fFile" where the result tree "atree" should be 
> stored. Later, I create the result tree "atree" in a class method.
> After filling "atree" I want to add "atree" as friend to fTree, too.
> The relevant code fragment of the method looks like this:
>     TTree *atree = new TTree(treename, "");
>     // fill atree
>     fFile->cd();
>     atree->Write();
>     fTree->AddFriend(atree->GetName(), fFile->GetName());
> 
> In this case AddTree() results in the following message:
> Warning in <TFile::Init>: file /Users/cs/ROOT/rootcode/tmp.root probably 
> not closed, trying to recover
> Info in <TFile::Recover>: /Users/cs/ROOT/rootcode/tmp.root, recovered 
> key TTree:Test at address 350
> Warning in <TFile::Init>: successfully recovered 1 keys
> 
> Nevertheless, everything works fine including the call to the
> destructors, where I delete "fDataFile" with "SafeDelete(fDataFile)".
> 
> In contrast, when I add "atree" as friend using:
>     fTree->AddFriend(atree->GetName(), fFile);
> everything works fine until I call the destructors.
> When I try to delete "fDataFile" with "SafeDelete(fDataFile)" then
> root crashes beyond recovery with "*** Break *** bus error"
> 
> However, if I remove "atree" after usage by calling in a different method
>     fTree->RemoveFriend(atree);
> then everything works fine again and I can call "SafeDelete(fDataFile)"
> in the destructor.
> 
> Does anybody have an idea what might be the reason for this behavior?
> (I am afraid ths code is too complex to extract a simple macro.)
> 
> Thank you in advance
> Best regards
> Christian
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> C.h.r.i.s.t.i.a.n. .S.t.r.a.t.o.w.a
> V.i.e.n.n.a.         .A.u.s.t.r.i.a
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> 



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET