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