Hi Pierre-Luc,
Things are now clear. You cannot do:
Int_t* testptr; //[1]
when specifying [xx] in the comment field of a data member that is a
pointer, xx must be a class member defined before the pointer (in the
class itself or a base class). xx cannot be a constant
If your array is of constant length, declare, eg
Int_t testptr[8];
All this is explained in the Users Guide.
Rene Brun
On Fri, 6 Jun 2003,
Pierre-Luc Drouin wrote:
> Here's my header file:
>
> #include <cstdio>
> #include "Rtypes.h"
> #include "TObject.h"
>
> #ifndef _TEST_
> #define _TEST_
>
> class Test:public TObject{
> public:
> Test():testvar(2),testptr(NULL){printf("Test()\n");};
> Test(const Test& rhs){printf("Test(const Test& rhs)\n");};
> virtual ~Test(){printf("~Test()\n"); if(testptr) delete testptr;};
> void SetTest(){if(!testptr) testptr=new Int_t;};
>
> private:
> Int_t testvar;
> Int_t* testptr; //[1]
>
> ClassDef(Test,1)
> };
>
> #endif
>
> Now my source file (no member function here):
>
> #include "Test.h"
>
> ClassImp(Test)
>
> The code I've tried is this one:
> TFile f1("test.root","NEW");
> Test* mytest=new Test;
> f1.Add(mytest);
> f1.Write();
>
> It crashes after the TFile::Write() call...
> Everything works when I call Test::SetTest() before calling
> TFile::Add() (notice that Test::SetTest() does nothing if testptr
> is non-null) because it passes an address to testptr.
>
> I want to be able to write a Test instance in the case the function
> SetTest() isn't called
>
> I'm using ROOT 3.05/05 with gcc 3.2.2
>
> Thank you
>
> Pierre-Luc Drouin
>
>
> On Fri, 6 Jun 2003, Rene Brun wrote:
>
> > Hi Pierre-Luc,
> >
> > ROOT supports null pointers in I/O.
> > I suspect a problem with your destructor.
> > Make sure to reset to 0 the pointer when you delete the
> > object.
> >
> > As always, try to send an example as short as possible reproducing the
> > problem. You and me will gain time.
> >
> > Rene Brun
> >
> >
> > On
> > Fri, 6 Jun 2003, Pierre-Luc
> > Drouin
> > wrote:
> >
> > > Hi,
> > >
> > > I've a class that contains a member variable that is a pointer to another
> > > object. This pointer can be NULL, if there's no need for a hold
> > > object. The code of my class takes it into account, with
> > > if(myptr!=NULL) conditions when operations on myptr have to be
> > > done. However, I've noticed that ROOT craches when I try to save this
> > > object into a ROOT file. I could use a Int_t variable 'hasptr' that would
> > > have a value of 0 when there's no object hold by myptr and a value of 1
> > > when there's one and I could indicate a size of '// [hasptr]' for ROOT in
> > > the header file, but this would take useless memory...
> > >
> > > Is there a Streamer or similar ROOT function I could overload for this
> > > class in a way that it could handle a NULL pointer without crashing
> > > ROOT?
> > >
> > > Thank you!
> > >
> > > Pierre-Luc Drouin
> > >
> >
>
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET