Re: [ROOT] Seg. Fault with ROOT 4.00/08 but not with ROOT 3.10/02

From: Rene Brun (brun@pcbrun.cern.ch)
Date: Mon Sep 06 2004 - 22:25:02 MEST


Hi Julien,

See your main.C file modified below. (see comments)
Read chapter about Object Ownership in the Users guide

Rene Brun

{
  gSystem->Load("libTExpositionMap.so");

  TObjArray *A = new TObjArray(1);

  TFile f("expo-time.tree.root");

  if(f.IsZombie()) {
    return;
  } else {

    TTree *tree = (TTree *)f.Get("tree");
    TBranch *branch = tree->GetBranch("Exposition_Maps");
    TExpositionMap *emap =0;
    branch->SetAddress(&emap);
    TH1::AddDirectory(kFALSE); //by default histograms are addeed to the 
current dir
    for(Int_t i = 0 ; i < tree->GetEntries() ; i++) {
      branch->GetEntry(i);

      A->AddLast(emap);

    }

    TExpositionMap *emap2 = (TExpositionMap *)A->At(15);
    TH2D *map2 = emap2->GetHExpoMap();
    cout << map2->GetBinContent(10,10) << endl;

    f.Close(); //histogram in the current dirs are deleted

    TExpositionMap *emap3 = (TExpositionMap *)A->At(15);
    TH2D *map3 = emap3->GetHExpoMap();
    cout << map3->GetBinContent(10,10) << endl;
  }
}

On Mon, 6 Sep 2004, 
Julien Bolmont 
wrote:

> 
> Hi Rene,
> 
> Here is a short program reproducing my problem.
> 1. Build the library typing :
> make (I hope it will work this time !)
> 2. Run the macro "main.C". It should write "18240" twice with ROOT 
> 3.10/02 and only once with ROOT 4.00/08 because in this version, 
> TFile::Close() seems to destroy all objects read in the file which 
> leads to a Seg. Fault.
> 
> Could you explain me why the two versions have such different 
> behaviours ?
> What is the proper way to manage ressources from a TFile ? Shall I keep 
> it open from the beginning to the end of the execution ?
> 
> Thanks again,
> Julien
> 
> 



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:09 MET