Re: [ROOT] Problem with memory leak

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Nov 10 2000 - 14:55:53 MET


Hi Dimitris,
In your program below, when you close the file (f->Close()), all objects
like TH1 and TTree associated with this file in memory are automatically
deleted. You should not have the statement "delete tree" after "f->Close():
You can place this statement before f->Close(), but this is not necessary.

Rene Brun

> Dr. D. Sideris wrote:
> 
> Hi, I'm trying to use root for a simple application but it seems the moment I
> solve one problem a new one occures... That's not by any means a problem of
> ROOT, it could be just me. Now after I solved several problems by magic...
> (for some reason VC++ didn't like 'cout' inside my class) I've run into a new
> problem. I create a tree and a branch, I fill it and tree->Print() gives a
> reasonable output, but when I do f->Write(); (f is my TFile) I get:
> 
> <CustomReAlloc2>: passed oldsize 1032, should be 17694850
> Fatal in <CustomReAlloc2>: unreasonable size (17694850)
> aborting
> Warning in <TWinNTSystem::StackTrace>: this method must be overridden!
> Press any key to continue
> 
> 
> I paste the function below, in case someone has a usefull sugestion. Thanks
> 
> 
> 
> Dimitris
> 
> 
> Int_t Global::ReadAscii()
>  {
>  int pixel=0,totpixels_f=0,p=0,cutim=0,rtim=0;
>  float v[300]={0},v0=0,cur[4000]={0};
>  int nlines = 0;
> 
> 
>  int nic[3000]={0},totic=0;
>  float avi=0.,invavi=0,ic[4000]={0},tic[4000]={0};
> 
>  int split = 0;
>  int bsize =256000;
> 
> //    ifstream fout,fcur;
> 
>  ifstream *fout = new ifstream;
>  ifstream *fcur = new ifstream;
> 
>  tim=0;
> 
> // Create a ROOT Tree
> 
>    A *a = new A;
>    TFile *f = new TFile("A.root","recreate");
>    tree = new TTree("T","An example of ROOT tree");
>    tree->Branch("aa","A",&a,bsize,split);
> 
> 
>  Float_t rtim_period=Float_t(0.7);
> 
>  int mintim=400000;
>  int maxtim=0;
>  Float_t ti=Float_t(10.003);
> 
> 
> 
> // FILE *fout=fopen("test.out","r");
> // FILE *fcur=fopen("test2.cur","r");
>     fout->open("test.out", ios::in);
>     fcur->open("test2.cur", ios::in);
> 
>    int i=0;
>    int ncols=0;
> 
>    while (1) {
> //  ncols=fscanf(fcur,"%i    %f",&nic[i],&ic[i]);
>         *fcur >> nic[i] >> ic[i];
>         if (!fcur->good()) break;
>   ic[i]*=1000;
>         avi+=ic[i];
>         if (ic[i]==0) ic[i]=149.5;
>         invavi+=1/ic[i++];
>    }
> 
> 
>  totic=i;
>  avi=avi/float(totic);
>  invavi=invavi/float(totic);
> 
> 
> 
>  if (avi==0.) {
>   *logf << "WARNING: No Current Info Available\n" <<endl;
> 
>  } else {
>    *logf << "Average Current= " << avi << '\n' <<endl;
>   tic[0]=ti;
>   ic[0]=avi;
>   for(i=1;i<=totic;i++){
>    if(ic[i]==0.) ic[i]=avi;
>    tic[i]=(tic[i-1]+(1/ic[i]+1/ic[i-1])/2*avi*ti);
>   }
>  }
> 
> 
> 
>  int pi=1;
>  int tim2=0;
> 
>  pixel=0;
>  a->rv[0]=0;
>  v[0]=0;
> 
>  while (tim<100) {
> 
> //  ncols=fscanf(fout,"%i %f %i",&pixel,&v[pixel+1],&totpixels_f);
> 
>   *fout >> pixel >> v[pixel+1] >> totpixels_f ;
>   if (!fout->good()) break;
> 
> //  if (ncols<0) break;
> 
> 
>   a->rv[pixel+1]=v[pixel+1];
> 
>      cutim=int(tim/ti+1);
> 
>   if (cutim>totic) {
>          cur[pixel+1]=ic[totic];
>         } else {
>          cur[pixel+1]=ic[cutim];
>   }
> 
> 
> rtim=int((float(tim)-float(cutim)*ti)/ti*(tic[cutim+1]-tic[cutim])+tic[cutim]);
> 
> 
>         a->time=tim;
> //  a->rtime=rtim;
>   if (pi==256) {
>    if (pixel!=255) {
>           *logf << "Mismach in reading file. STOP\n" <<endl;
>           break;
>    }
> 
> 
> 
>    if (tim<mintim || tim>maxtim) {
>     tree->Fill();
>           tim2++;
>         if (int(tim2/1000.)==tim2/1000.) *logf << ".. " << tim2 <<'\n' <<endl;
>    }
>    tim++;
>          pi=0;
> 
>    if (int(tim/1000.)==tim/1000.)  *logf << ".. " << tim2 << '\n' <<endl;
>         }
>   pi++;
> 
>   nlines++;
>    }
> 
>   *logf << " found " << nlines << " points\n" <<endl;
> 
>   tree->Print();
>  f->Write();
> 
>     *logf << "here1\n" << endl;
>   *logf << "here2\n" << endl;
>   fout->close();
>   *logf << "here3\n" << endl;
>   fcur->close();
> 
> ///   *logf << "here4\n" << endl;
>  f->Close();
>   *logf << "here5\n" << endl;
>  delete tree;
>  delete a;
>  delete f;
> // delete fout;
> // delete fcur;
> *logf << "END\n" << endl;
> // logf->close();
>    return 0;
>  }
> 
> 
> 
> 
>



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:37 MET