Hi Ruben,
When your TClonesArray contains dynamic structures (like TNamed),
you must delete these dynamic structures before clearing
the array at each entry. I give an example of what you can do
below, still preserving some of the advantages of a TClonesArray.
Rene Brun
//_________________________________________________________
void trrd()
{
printf("Reading back the tree\n");
char name[100];
TClonesArray* fVTVerts = new TClonesArray("TNamed",10);
//
TFile* flin = new TFile("trout.root");
TTree *tree = (TTree*)flin->Get("tree");
TBranch* trbr = tree->GetBranch("mybr");
trbr->SetAddress(&fVTVerts);
//
int nev = tree->GetEntries();
int iv,nv;
for (int iev=0;iev<nev;iev++) {
trbr->GetEntry(iev);
nv = fVTVerts->GetEntriesFast();
printf("\n\nRead Event %d %d Old Vertices Are\n",iev,nv);
fVTVerts->Print();
printf("\nNow will call TClonesArray::Delete() and Create new
Vertices\n");
for (iv=0;iv<nv;iv++)
((TNamed*)fVTVerts->At(iv))->SetNameTitle("","");
fVTVerts->Clear();
// Reanalyze event, creating new vertices
nv = gRandom->Integer(5)+1;
for (iv=0;iv<nv;iv++) {
sprintf(name,"New Vtx %d of Ev %d",iv,iev);
TNamed* vp = new ((*fVTVerts)[iv]) TNamed(name,name);
}
printf("\nUpdated Event: New Vertices Are:\n");
fVTVerts->Print();
for (iv=0;iv<nv;iv++)
((TNamed*)fVTVerts->At(iv))->SetNameTitle("","");
fVTVerts->Clear();
}
delete flin;
delete fVTVerts;
}
On Mon, 25 Nov 2002, Ruben Shahoyan wrote:
> Hello,
> I have encontered the following problem:
> I am reading from the tree an event, which among other branches has one
> with TClonesArray of the vertices (objects which allocate the memory).
> I need to reanalize the event, so I have to clean the loaded vertices and
> create new ones. But if I call TClonesArray::Delete() to clean this array,
> loading next event produces SegVol.
>
> Below I show the simple macros demonstrating the problem. Does anybody
> know the solution?
>
> Thanks in advance,
> Ruben Shahoyan
>
>
> //_____________________ Sample Macro________________________
> void trwr(int nev);
> void trrd();
>
> void trtest(int nev=20)
> {
> // Step 1: Create tree, with the branch of TClonesArray of the objects
> // allocating memory
> trwr(nev);
> //
> // Step 2: Read the tree, trying to "modify" the TClonesArray
> trrd();
> }
>
> //_________________________________________________________
> void trwr(int nev)
> {
> printf("Generating the tree with %d events\n",nev);
> char name[100];
> Int_t bfsize=32000;
> Int_t split=2;
> TClonesArray* fVTVerts = new TClonesArray("TNamed",10);
> fVTVerts->SetOwner();
> //
> TFile* flout = new TFile("trout.root","RECREATE");
> TTree *tree = new TTree("tree","tree");
> tree->Branch("mybr","TClonesArray",&fVTVerts,bfsize,split);
> //
> for (int iev=0;iev<nev;iev++) {
> fVTVerts->Delete();
> int nv = gRandom->Integer(10)+1;
> for (int iv=0;iv<nv;iv++) {
> sprintf(name,"Vtx %d of Ev %d",iv,iev);
> TNamed* vp = new ((*fVTVerts)[iv]) TNamed(name,name);
> }
> tree->Fill();
> }
> tree->Write();
> delete tree;
> flout->Close();
> delete flout;
> delete fVTVerts;
> }
>
> //_________________________________________________________
> void trrd()
> {
> printf("Reading back the tree\n");
> char name[100];
> TClonesArray* fVTVerts = new TClonesArray("TNamed",10);
> fVTVerts->SetOwner();
> //
> TFile* flin = new TFile("trout.root");
> TTree *tree = (TTree*)flin->Get("tree");
> TBranch* trbr = tree->GetBranch("mybr");
> trbr->SetAddress(&fVTVerts);
> //
> int nev = tree->GetEntries();
> for (int iev=0;iev<nev;iev++) {
> trbr->GetEntry(iev);
> printf("\n\nRead Event %d %d\n Old Vertices Are",iev,fVTVerts->GetLast()+1);
> fVTVerts->Print();
> printf("\nNow will call TClonesArray::Delete() and Create new Vertices\n");
> //fVTVerts->Clear(); !! Works with Clear, but will lead to memory leak!
> fVTVerts->Delete();
> // Reanalyze event, creating new vertices
> int nv = gRandom->Integer(5)+1;
> for (int iv=0;iv<nv;iv++) {
> sprintf(name,"New Vtx %d of Ev %d",iv,iev);
> TNamed* vp = new ((*fVTVerts)[iv]) TNamed(name,name);
> }
> printf("\nUpdated Event: New Vertices Are:\n");
> fVTVerts->Print();
> //
> }
> delete tree;
> flin->Close();
> delete flin;
> delete fVTVerts;
> }
>
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:20 MET