Dear Rene Thank you for your tip. Sorrowly, I get a strange result, when setting TList of TBaseClass to null. My constructors look as follows: //--- MyClass ----------- class MyClass: public TNamed { TFile *fFile; //! TContent *fContent; //! TList *fTrash; void AddData() {derivedClass->AddTree();} void UpdateData() {derivedClass->UpdateTree();} void DeleteData() {derivedClass->DeleteTree();} } MyClass::MyClass() :TNamed() { if(kCS) cout << "---MyClass::MyClass(default)------" << endl; fFile = 0; fContent = 0; fTrash = 0; cout << "TClass::IsCallingNew()= " << TClass::IsCallingNew() << endl; }//Constructor MyClass::MyClass(const char *name, const char *title) :TNamed(name, title) { if(kCS) cout << "---MyClass::MyClass------" << endl; fFile = 0; fContent = 0; fTrash = new TList(); }//Constructor //--- TBaseClass----------- (demo name of course) class TBaseClass: public TNamed { TList *fList; TList *fTrash; void AddTree(); void UpdateTree(); void DeleteTree(); } TBaseClass::TBaseClass() :TNamed() { if(kCS) cout << "---TBaseClass::TBaseClass(default)------" << endl; fList = 0; //<===== problem when both TList set to = 0 fTrash = 0; //<===== problem when both TList set to = 0 // fList = new TList(); // fTrash = new TList(); cout << "TClass::IsCallingNew()= " << TClass::IsCallingNew() << endl; }//Constructor TBaseClass::TBaseClass(const char *name, const char *title) :TNamed(name, title) { if(kCS) cout << "---TBaseClass::TBaseClass------" << endl; fList = new TList(); fTrash = new TList(); }//Constructor When I create either fList or fTrash or both in the default constructor, then I have the problem that the second root session contains the deleted objects. However, when I set both fList = 0 and fTrash = 0 in the default constructor, as you suggested, then my first root session is ok, and I can check the root file with TBrowser. Interestingly, in my second root session, where I delete trees and add new trees, I am no longer able to open the root file with TBrowser, instead I get a "*** Break *** bus error" after the output: root [3] TBrowser b root [4] ---TBaseClass::TBaseClass(default)------ TClass::IsCallingNew()= 1 What could be the reason for this behavior? Thank you Christian Rene Brun wrote: > Hi Christian, > > My guess is that in the default constructor for your BaseClass > (I hope your class is not called TBaseClass!) you set fContent > to a non null value. > The default constructor is called by ROOT I/O to create a dummy > instance of your class to build the class dictionary or stream in > an object from the file. > > I suggest you add print statements in your BaseClass > constructor/destructor to see what is happening. > In your default constructor, you can test the return value > of Bool_t TClass::IsCallingNew() to find out if your constructor > is called by you or by ROOT I/O. > > Rene Brun > > > On Sun, 18 Aug 2002, cstrato wrote: > > >>Dear Rooters >> >>I have a strange problem in a pretty complex program, where >>I store TTrees in a TFile in one root session, but am also >>able to add, delete or update trees in the next session. >>The important classes compiled as library are: >>class TContent: public TList {} >> >>class TBaseClass: public TNamed { >> void AddTree(); >> void UpdateTree(); >> void DeleteTree(); >>} >> >>class DerivedClass: public TBaseClass {} >> >>class MyClass: public TNamed { >> TFile *fFile; >> TContent *fContent; >> >> void AddData() {derivedClass->AddTree();} >> void UpdateData() {derivedClass->UpdateTree();} >> void DeleteData() {derivedClass->DeleteTree();} >>} >> >>First root session: >>In a macro I call myClass->AddData(tree1). A tree is created in >>fFile, and derivedClass1 is stored in fContent. >>Assume that I have created three trees in this way, tree1, tree2 >>and tree3. When I call TBrowser, everything is perfectly ok. >> >>Second root session: >>In a macro I call: >>myClass->AddData(tree4) >>myClass->DeleteData(tree1) >>myClass->DeleteData(tree2) >>myClass->AddData(tree5) >>When I open fFile with TBrowser, tree4 and tree5 are added, and >>their corresponding derivedClass4 and derivedClass5 is added to >>fContent, while tree1 and tree2 are deleted and their corresponding >>derivedClass1 and derivedClass2 are deleted from fContent, as >>expected. So far everything is ok. >>But now fFile contains suddenly the three derivedClass1,2,3 from >>the first root session as single objects in fFile. Apparently, >>the old content of fContent is read and stored in fFile. >>I do not understand, why these objects are suddenly stored in >>fFile, since I never call fFile->Write() but only obj->Write(). >> >>The destructor of BaseClass looks as follows: >>BaseClass::~BaseClass >>{ >> if (fFile) { >> // Write content to file only if new file or file is updated >> fFile->cd(); >> if (fContent && (strcmp(fFile->GetOption(), "READ") != 0)) { >> // kSingleKey since fContent is a TCollection!! >> fContent->Write("", TObject::kSingleKey | TObject::kOverwrite); >> }//if >> >> fContent->Delete(); >> SafeDelete(fContent); >> SafeDelete(fFile); >> }//if >> >>// fTrash->Delete(); >> SafeDelete(fTrash); >>} >> >>My questions are: >>Can anybody give me a hint why the objects are written to fFile? >>How can I prevent that the old list content is written to fFile? >> >>Thank you in advance for your help. >> >>Best regards >>Christian >>_._._._._._._._._._._._._._._._ >>C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a >>V.i.e.n.n.a A.u.s.t.r.i.a >>_._._._._._._._._._._._._._._._ >> >> >> >> >> >> >> > > >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:05 MET