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