Re: [ROOT] Saving a object in a ROOT file with a NULL pointer

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Jun 06 2003 - 18:10:46 MEST


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