Hi Yuriy, Thanks for reporting this special case when opening a non existing file. I have protected the constructor and destructor. In CVS Rene Brun "Y. Shitov" wrote: > > Dear ROOTers, > > I think that I found the bug in THbookFile class. The point is that > ctor works incorrectly opening non existing HBOOK file. > > The following script demonstrates the problem: > > void rz() { > if (!TClassTable::GetDict("THbookFile")) > gSystem->Load("libHbook"); > THbookFile *f; > > Int_t i=0; > while (++i) { > f = new THbookFile("blablabla"); > cout << i << "-th step: Current directory is '" > << f->GetCurDir() << "'. "; > if (i<10) > cout << "OK." << endl; > else { > cout << "fgLuns stack is full. " > "Can't open any THbookFile objects more..." << endl; > getchar(); > } > // delete f; > } > } > > There are two points here: > 1. One need to reset non-used item in the container of free logical units > fgLuns > (http://root.cern.ch/root/htmldoc/THbookFile.html#THbookFile:fgLuns) > in ctor (see code below). > > 2. Call of dtor in code above (commented line) leads to crash, because > fList,fKeys > http://root.cern.ch/root/htmldoc/THbookFile.html#THbookFile:fList > http://root.cern.ch/root/htmldoc/THbookFile.html#THbookFile:fKeys > lists deleted there are not initialized in this particular case. > > Best wishes, > Yuriy. > > Correction proposed for THbookFile::THbookFile(const char *fname, Int_t lrecl) > > > if (ier) printf (" Error on hropen was %d \n", ier); > > if (quest[0]) { > > printf("Error cannot open input file: %s\n",fname); > > } > > if (ier || quest[0]) { > fgLuns[fLun-10]=0; > > fLun = 0; > > MakeZombie(); > > return; > > }
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET