Hello, I've included code for a small test class which illustrates my problem. Two files are included (ClassA.h and ClassA.C) which define and implement ClassA, a simple class with a TH1F as a data member (fHistB). In CINT, I can load in the class definition (.L ClassA.C++), create a ClassA object and stream it to file without problem, with root [0] .L ClassA.C++ root [1] ClassA A; root [2] TFile fout("test_file.root","RECREATE"); root [3] A.Write("A"); root [4] .q When I then read the object back from file, ie. root [0] .L ClassA.C++ root [1] TFile fin("test_file.root","READ"); root [2] ClassA *A = (ClassA *)fin.Get("A"); and then quit root, I encounter the probem (segmentation violation since fHistB is being deleted since there is a pointer to it in the TObjectTable), even though in the constructor for ClassA, the call is made to fHistB.SetDirectory(0). --Mark Philippe Canal wrote: > > Hi Mark, > > Originally, I had called B.SetDirectory(0) in > A's custom Streamer function, which worked, but I would prefer to use > the automatic Streamer. > > You should probably call B.SetDirectory right after the creation of B > (thus probably in A's constructor). > > Cheers, > Philippe. > > -----Original Message----- > From: owner-roottalk@pcroot.cern.ch > [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Mark Boulay > Sent: Wednesday, January 30, 2002 12:33 PM > To: Rene Brun > Cc: roottalk@pcroot.cern.ch > Subject: Re: [ROOT] Problem with TObjectTable::Delete() > > Hi Rene, > Thanks for your reply. Adding the call B.SetDirectory(0) in A's > constructor > does not solve the problem. Originally, I had called B.SetDirectory(0) > in > A's custom Streamer function, which worked, but I would prefer to use > the automatic Streamer. > > Also, calling the static TH1::AddDirectory(kFALSE) works around the > problem, but I'd like to keep the ability to automatically add > histograms to the current directory. > > --Mark > > > Rene Brun wrote: > > > > Hi Mark, > > > > In the constructor of class A, you should add the following statement; > > B.SetDirectory(0); > > By definition, A owns B. However the TH1F constructor (by default) will > > add the created histogram to the list of objects in the current directory/file. > > When the file is closed, this object is deleted. You will get the object > > deleted twice. > > > > You can also turn off the feature adding automatically the histogram objects > > to the current directory (gDirectory->GetList()) by calling the static function > > TH1::AddDirectory(kFALSE); > > Note that if you do that, doing something like file->Write() will not > > save your histograms to the file. > > > > Rene Brun > > > > Mark Boulay wrote: > > > > > > Hello, > > > > > > I have a class (call it class A), derived from TObject which has as a > > > data member a TH1F > > > (call it TH1F B). > > > When an object of class A is read in from file, and then the file > > > closed, > > > a call is made to TObjectTable::Delete() deleting all objects which > > > were > > > contained in the file. > > > The object A is first deleted, and then an attempt is made to delete B, > > > since a reference to it still exists in gObjectTable. The problem > > > is that B has presumably already been deleted along with A, since it > > > is a data member of class A. > > > > > > I'm using ROOT 3.02.07 under RH linux 7.2. > > > > > > Thanks in advance for assistance, > > > Mark #ifndef TEST_CLASSA_H #define TEST_CLASSA_H #include "TObject.h" #include "TH1.h" class ClassA : public TObject { public: ClassA(); ~ClassA(); private: TH1F fHistB; ClassDef( ClassA, 1) }; #endif #include "ClassA.h" ClassImp(ClassA) ClassA::ClassA() { //Class A constructor. fHistB.SetDirectory(0); } ClassA::~ClassA(){;}
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET