Re: [ROOT] Mem leak using TTree with TObjArray+TclonesArray

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Oct 05 2001 - 09:37:54 MEST


Hi Luigi,

Thanks for sending me your tar file with your programs.

I can run it (TauAnalysis, plots) successfully with no memory leaks
when using the development version 3.02.
A few weeks ago, I fixed a problem (in 3.01) when deleting collections
containing
other collections when reading an event.

Rene Brun

Luigi Del Buono wrote:
> 
> Hi rooters,
> 
> I waited a long time before posting this, but I have no clue on this
> problem so...
> 
> I seem to have a memory leak that i cannot trace to my personal code...I
> have made a much simplified version of code which apparently reproduces
> the problem.
> The leak is eating something like 10 Kbytes of memory for each "iteration"
> in the main loop of this code, it's bigger in the full code version.
> This prevents me from running on big amounts of data (which is needed, of
> course).
> 
> The problem happens when reading a ROOT TTree file which contains
> occurences of one simple structure with one TObjArray* member, the
> TObjArray elements themselves containing another object which itself has a
> TClonesArray* member.
> So, this is a story about storing and reading in a Root TTree a TObjArray
> which elements are mainly TClonesArray. The problem appears while READING
> the TTree.
> 
> Another problem is that, after a few thousand events, the program is
> printing out thousands of Warning messages like:
> 
> Warning in <TObjectTable::Remove>: 0x0a61b7b4 not found at 1739
> Warning in <TObjectTable::Remove>: 0x0a61d8fc not found at 1739
> Warning in <TObjectTable::Remove>: 0x0a61d8f0 not found at 1739
> ...
> Warning in <TObjectTable::Remove>: 0x0a7a3a5c not found at 5779
> Warning in <TObjectTable::Remove>: 0x0a7a3a50 not found at 5779
> Warning in <TObjectTable::Remove>: 0x0a7a3a98 not found at 5779
> Warning in <TObjectTable::Remove>: 0x0a7a3a18 not found at 5779
> 
> I have no idea of what is happening, so i am calling the experts...
> 
> Configuration info: Linux RedHat 6.2, Root 3.01/06, the program is
> compiled whith gcc egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
> 
> I'll try to give here the main elements of the code, so people can see if
> something is wrong somewhere.
> 
> Thanks any help/suggestion
> 
> //
> //------Base class stored in tree--------------------------
> //
> class TauEvent : public TObject {
> 
> public:
>     //Constructor
>     TauEvent();
> 
>     //Destructor
>     ~TauEvent();
> 
>     //Accessors
>     TauC1 &GetC1(Int_t iC1);  //returns a pointer to a 3-1 comb. array
> 
> public:
>     TObjArray *C1;    //The TObjArray
> 
> public:
>     ClassDef(TauEvent,1)
> };
> 
> //
> //-----Class to be stored in the TObjArray--------------------
> //
> class TauC1 : public TObject {
> 
> public:
>     //Constructor
>     TauC1();
> 
>     //Destructor
>     ~TauC1();
> 
>     //Access sub data
>     TauC2 *AddC2(Int_t iC2);
>     TauC2 &GetC2(Int_t iC2);
>     TClonesArray &GetC2() { return *C2;};
> 
>     //3-body info
>     TLorentzVector V1;
> 
> private:
>     TClonesArray *C2;    //the TClonesArray
> 
> public:
>     ClassDef(TauC1,1)
> };
> 
> //
> //--------Constructor and destructor of TauEvent
> //
> //contructor
> ClassImp(TauEvent)
> 
> TauEvent::TauEvent() :
> C1(0)
> {
>   C1=new TObjArray();
> }
> 
> //destructor
> TauEvent::~TauEvent()
> {
>   if (C1) {
>     if(C1->GetEntries()>0) C1->Delete();
>     delete C1;
>   }
> }
> 
> //
> //--------Constructor and destructor of TauC1
> //
> //contructor
> ClassImp(TauC1)
> 
> TauC1::TauC1()
> {
>   C2=new TClonesArray("TauC2");
> }
> 
> //destructor
> TauC1::~TauC1()
> {
>   if(C2) {
>     if(C2->GetEntries()>0) C2->Delete();
>     delete C2;
>   }
> }
> 
> //
> //------Data fill & access routines
> //
> TauC2 *TauC1::AddC2(Int_t iC2) {
>   return (new ((*C2)[iC2]) TauC2);
> }
> 
> //
> //TTree creation code
> //
> Rfile=new TFile("Event.root","RECREATE","EventInfo",1);   //0=no compress
> Rtree=new TTree("EventTree","EventInfo tree",0);
> Rtree->SetBranchStyle(0);   //!!!!old style branch (ROOT 3.01/06)
> Rtree->Branch("C1", "TObjArray", &(EventInfo.C1), 2048, 0);
> 
> //
> //Writing loop code (called for each "event")
> //
> for (int itau1=0;itau1<1;itau1++) { //structure 1 loop
>   TauC1 *C1=new TauC1;
>   C1->V1.SetXYZT(1,2,3,4);
> 
>   for (int itau2=0;itau2<1;itau2++) {  //structure 2 loop
>     TauC2 *C2=C1->AddC2(itau2);
>     C2->V2.SetXYZT(10,20,30,40);
>   }
> 
>   EventInfo.C1->Add(C1);  //Fill C1 structure level
> }
> Rtree->Fill();   //final fill for root data
> EventInfo.C1->Delete();   //clear local objects in event Tree
> 
> //
> // Reading loop code
> //
> TChain *Tree;   //create global tree
> TBranch *C1Branch;
> TauEvent EvI;
> Int_t NEventMax;
> TObjectTable* gObjectTable;
> 
> //Load tree
> Int_t init_tree()
> {
>   //Multi file access
>   Tree=new TChain("EventTree");
>   Tree->Add("Event.root/EventTree");     //Connect root file
> 
>   //Connect root branches to local variables  ("EvI")
>   C1Branch=Tree->GetBranch("C1");
>   C1Branch->SetAddress(&(EvI.C1));
>   C1Branch->SetAutoDelete(kTRUE);  //
> 
>   Int_t Nevent=(Int_t)Tree->GetEntries();
>   cout << "Main: Number of events in tree: " << Nevent << endl;
> 
>   return 0;
> }
> 
> //reading loop
> Int_t plot_t31()
> {
>   TH1F hV1X("hV1X", "V1 x", 60, 0., 5.);
>   Int_t Nevent=(Int_t)Tree->GetEntries();
> 
>   for(int iev=0;iev<TMath::Min(Nevent,NEventMax);iev++) {    //fill histos
>     Tree->GetEntry(iev);
>     if(iev%100==0) cout << "iev: " << iev << endl;
> 
> //    gObjectTable->Print();
> 
>     for(int iC1=0;iC1<EvI.C1->GetEntries();iC1++) {
>       TauC1 &C1=EvI.GetC1(iC1);
>       Double_t V1X=C1.V1.X();
>       hV1X.Fill(V1X);
>       cout << "V1X:" << V1X << endl;
>     }
>     if(EvI.C1->GetEntries()>0) EvI.C1->Delete();   //clear local objects
> in event
>   }
> 
>   TCanvas *c1 = new TCanvas("c1","Test",200,10,900,1000);
>   c1->Clear();
>   c1->Divide(1,2);
>   c1->cd(1); hV1X.DrawCopy();
> 
>   return 0;
> }



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:02 MET