RE : [ROOT] TArrayD

From: GENTIT Francois-Xavier DAPNIA (GENTIT@dapnia.cea.fr)
Date: Mon Mar 31 2003 - 09:18:41 MEST


Mr Rademakers,
The reason why I tried these 2 lines of code:

TArrayD *a = new TArrayD(10);
delete [] a->fArray;

is because the following 2 lines of code:

TArrayD *a = new TArrayD(10);
delete a;

give a problem in Visual C++.NET. Visual C++.NET sees a breakpoint at the
second line, even if the user has not put a breakpoint. Imagine the
annoyance if this happens in a loop to be done 1000 times! Since this did
not happened with Visual C++ 6.0, I first thought that it was a bug in
Visual C++.NET. But the fact that the perfectly valid C++ line: 

delete [] a->fArrayD;

crashes on all compilers and all machines indicates it is a problem of ROOT.


Gentit François-Xavier
DAPNIA/SPP CEA Saclay
http://gentit.home.cern.ch/gentit/



-----Message d'origine-----
De : Fons Rademakers [mailto:Fons.Rademakers@cern.ch] 
Envoyé : vendredi 28 mars 2003 18:30
À : Brett Viren
Cc : GENTIT Francois-Xavier DAPNIA; 'Club ROOT "(roottalk@pcroot.cern.ch)'"
Objet : Re: [ROOT] TArrayD

The fact that you can do this does not mean that it should work. Why
would you like to do this, instead of using the dtor? For these simple
classes all data members are public for easy access, but you should not
do silly things. You can also pass a 0 to strlen and get a segv.

-- Fons


On Fri, 2003-03-28 at 16:41, Brett Viren wrote:
> GENTIT Francois-Xavier  DAPNIA writes:
>  > Dear Rooters,
>  > 
>  > The following 2 lines of code cause a crash of ROOT when compiled (not
in
>  > CINT) :
>  > 
>  >  
>  > 
>  >   TArrayD *a = new TArrayD(10);
>  > 
>  >   delete [] a->fArray;
>  > 
>  >  
>  > 
>  > I have tried them on Linux RedHat with ROOT 3.05.02 and
>  > 
>  > On Windows XP, Visual C++.NET, ROOT 3.05.03
>  > 
>  >  
>  > 
>  > Both cases crash. fArray being public, it should work? Is it a bug or a
>  > feature?
> 
> Having it public is bad, imo.  But anyways, if you are going to delete
> it this you had probably do what TArrayD does internally:
> 
>    TArrayD *a = new TArrayD(10);
>  
>    delete [] a->fArray;
>    a->fArray = 0;
> 
> Or, looking at the implementation you could replace those last two
> lines with:
> 
>    a->Adopt(0,0);
> 
> 
> -Brett.
-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:10 MET