Hello Rooters, I have a question concerning the ownership of some ROOT objects. In the below attached example I have a class derived from TFile which contains a TBranch and a TTree object. The class is used either for reading or for writing. Do I have to release the storage for the TTree object in the case of TMirrorEventFile::WriteMirrorEvent() ? Obviously not, because I get a SEGV when doing delete fTree. But if this is handled somewhere internally then delete fTree should do nothing ? I am using Root 2.24/05 (root_v2.24.Linux.2.2.14). Thanks Hermann-Josef ----------------------------------------------------------------------- #include <stdlib.h> #include <stream.h> #include <TFile.h> #include <TTree.h> #include "MiEventFile.hh" TMirrorEventFile::TMirrorEventFile() : TFile("data.root"), fBranch(0), fEvent(0), fFileName("data.root"), fTree(0) {} TMirrorEventFile::TMirrorEventFile( const char *fname, Option_t *option="", const char *ftitle="", Int_t compress=1 ) : TFile(fname, option, ftitle, compress), fBranch(0), fEvent(0), fFileName(fname), fTree(0) {} TMirrorEventFile::~TMirrorEventFile() { // Obviously the TFile is the owner of these objects if ( fTree ) delete fTree; } void TMirrorEventFile::Close( Option_t *option="" ) { // file was opened in write mode ... if ( TFile::GetBytesWritten() ) { TFile::Write(); // fTree = 0; fBranch = 0; } // cout << TFile::GetBytesWritten() << endl; // cout << TFile::GetBytesRead() << endl; // file was opened in read mode ... if ( TFile::GetBytesRead() ) { fTree = 0; fBranch = 0; } TFile::Close( option ); fEvent = 0; // now this address is invalid } Bool_t TMirrorEventFile::ReadMirrorEvent( TMirrorEvent** event ) { Bool_t valid_event = kFALSE, file_end = kFALSE; if ( !fTree ) { fTree = (TTree *)fFile->Get( "EventTree" ); if ( !fTree ) { cerr << "No Tree with given name found !" << endl; return kFALSE; } fNentries = (Int_t)fTree->GetEntries(); } fBranch = fTree->GetBranch( "EventBranch" ); if ( !fBranch ) { cerr << "No branch with name 'EventBranch' found !" << endl; return kFALSE; } while ( fBranch && !valid_event && !file_end ) { fBranch->SetAddress( event ); if ( fCurrentEvent < fNentries ) { valid_event = kTRUE; fTree->GetEvent( fCurrentEvent ); fCurrentEvent++; } else { cout << "End of file reached !" << endl; file_end = kTRUE; } } if ( valid_event ) return kTRUE; else return kFALSE; } Bool_t TMirrorEventFile::WriteMirrorEvent( TMirrorEvent** event ) { if ( !fTree ) { fEvent = *event; fTree = new TTree( "EventTree", "simple save tree" ); if ( !fTree ) { cerr << "Could not create Tree !" << endl; return kFALSE; } fTree->SetAutoSave( 1000000 ); // autosave when 1M written // create branch not in split mode ! // Note: this calls internally TMirrorEvent() and ~TMirrorEvent() // which is not quite clear to me ... fTree->Branch( "EventBranch", "TMirrorEvent", event, 64000, 0 ); } if ( *event != fEvent ) { cerr << "Changed address of data buffer !" << endl; return kFALSE; // fTree->Branch( "EventBranch", "TMirrorEvent", event, 64000, 0 ); } fTree->Fill(); return kTRUE; } ************************************************************************** * * * Dr. Hermann-Josef Mathes * * KASCADE & AUGER Collaboration * * Forschungszentrum Karlsruhe Phone: +49 7247 822429 * * Institut fuer Kernphysik FAX: +49 7247 824075 * * POB 3640 * * D-76021 Karlsruhe/Germany Mail: mathes@ik3.fzk.de * * hjmathes@web.de * * * ************************************************************************** * Feel free to visit my homepage: * * http://www-ik3.fzk.de/~mathes/Welcome.html * * My software project page for DAQ: * * http://www-ik3.fzk.de/~mathes/software/software.html * * * * Visit the institute and project homepages: * * http://www-ik3.fzk.de/ * * http://www-ik1.fzk.de/KASCADE_home.html * **************************************************************************
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:34 MET