Hi Eddy,
Replace your doit() function by the following:
void doit()
{
TH1F a("aap","aap",4,0,4);
TH1F b("noot","noot",4,0,4);
TH1F c = a+b;
c.SetName("mies"); c.SetTitle("mies");
printf("--nr: %d------\n",gDirectory->GetList()->GetSize());
gDirectory->GetList()->Print();
}Eddy Offermann wrote:
Rene Brun
>
> Dear Fons and Rene ,
>
> I believe that the directory list (gDirectory-GetList()) for
> the histograms is not correctly updated in case of the assignment
> operation "operator=":
>
> To illustrate this run the following macro:
>
> void doit()
> {
> TH1F c("mies","mies",4,0,4);
> TH1F a("aap","aap",4,0,4);
> TH1F b("noot","noot",4,0,4);
> c = a+b;
> printf("--nr: %d------\n",gDirectory->GetList()->GetSize());
> gDirectory->GetList()->Print();
> }
>
> Int_t test()
> {
> TH1F d("schip","schip",4,0,4);
> printf("--nr: %d------\n",gDirectory->GetList()->GetSize());
> gDirectory->GetList()->Print();
>
> doit();
>
> printf("--nr: %d------\n",gDirectory->GetList()->GetSize());
> gDirectory->GetList()->Print();
> }
>
> The result is
>
> cub:/work/eddy/ROOT/src> root -l
> *******************************************
> * *
> * W E L C O M E to R O O T *
> * *
> * Version 2.22/09 13 July 1999 *
> * *
> * You are welcome to visit our Web site *
> * http://root.cern.ch *
> * *
> *******************************************
>
> CINT/ROOT C/C++ Interpreter version 5.14.8, Jul 4 1999
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> root [0] .L effe.C
> root [1] test()
> --nr: 1------
> TH1.Print Name= schip, Total sum= 0
> --nr: 5------
> TH1.Print Name= schip, Total sum= 0
> TH1.Print Name= aap, Total sum= 0
> TH1.Print Name= aap, Total sum= 0
> TH1.Print Name= noot, Total sum= 0
> TH1.Print Name= aap, Total sum= 0
> --nr: 2------
> TH1.Print Name= schip, Total sum= 0
>
> *** Break *** segmentation violation
> Root >
>
> The operator definition should have been
>
> //______________________________________________________________________________
> TH1F& TH1F::operator=(const TH1F &h1)
> {
> if (this != &h1)
> {
> fDirectory->GetList()->Remove(this); // this line has been added
> ((TH1F&)h1).Copy(*this);
> }
> return *this;
> }
>
> and the result is
>
> --nr: 1------
> TH1.Print Name= schip, Total sum= 0
> --nr: 4------
> TH1.Print Name= schip, Total sum= 0
> TH1.Print Name= aap, Total sum= 0
> TH1.Print Name= noot, Total sum= 0
> TH1.Print Name= aap, Total sum= 0
> --nr: 1------
> TH1.Print Name= schip, Total sum= 0
>
> Eddy
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET