Re: bug in TH operator=

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Sep 02 1999 - 14:41:41 MEST


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