Hi John, I cannot reproduce your problem. Here is a transcript of my session. Rene Brun root [0] gSystem.Load("libPhysics") (int)0 root [1] .L MyNuc.cxx+ Info in <TUnixSystem::ACLiC>: creating shared library /home/brun/roottest/./MyNuc_cxx.so root [2] .L test.C+ Info in <TUnixSystem::ACLiC>: creating shared library /home/brun/roottest/./test_C.so root [3] test() ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ Creating object list.... done fNb_Objects=1, size of list=1 ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done fNb_Objects=6, size of list=6 fNb_Objects=6, size of list=6 ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done ++ Calling default ctor ++ Calling AddToObjList... AddToObjList............ done fNb_Objects=8, size of list=6 root [4] .q Frankland John wrote: > > Hello Rene > > Rene Brun wrote: > > > Hi John, > > > > You are not drawing the right conclusion from your observation > > with MyNuc::GetNbObj. Let me explain. > > > > The TClonesArray is based on the standard C++ "new with placement". > > When calling new(a[i]) myclass(), the following happens: > > -if a[i] is null, an object of myclass is allocated space and the > > myclass > > constructor is called. > > - if a[i] is not null, your myclass constructor is called. No need to > > allocate space (time consuming). The object is simply initialized by the > > statements in your constructor, overwriting the values of the data > > members > > created by a previous call to the constructor. The address of the object > > is the one previously stored at a[i] (new with placement). > > In your case your class MyNuc records only the number of calls > > to your myclass constructor. It does not record the number of times > > a new object has been allocated. > > > > > > > > > In order to see this happening, I modified the MyNuc class as in the > attachment. > I added a static TList to which I add the "this" pointer every time the ctor > is called, only if > the object pointed to is not already in the list. However, despite protecting > all possible > cases of pointer abuse, when I compile and run the test.C script attached (.L > libPhysics.so, > .L MyNuc.cxx+, then .L test.C+) it ends up in a segmentation fault: > > root [0] .L libPhysics.so > root [1] .L MyNuc.cxx+ > Info in <TUnixSystem::ACLiC>: creating shared library > /home/john/lib//home/john/ClonesTests/./MyNuc_cxx.so > root [2] .L test.C+ > root [3] test() > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > Creating object list.... > done > fNb_Objects=1, size of list=1 > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > done > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > done > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > done > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > done > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > done > fNb_Objects=6, size of list=6 > fNb_Objects=6, size of list=6 > ++ Calling default ctor ++ > Calling AddToObjList... > AddToObjList............ > > *** Break *** segmentation violation > Generating stack trace... > /usr/bin/c++filt: unknown demangling style `gnu-new-abi' > > I can't see why ! Can somebody please help me ? > My last CVS update/compile was July 14th, on Linux RH8 with gcc3.2. > > Thanks a lot > John > > -- > > [ganil logo] > > John D. Franklandtel: +33 > Beam Coordinator (0)231454628 > GANIL fax: +33 > B.P. 55027 (0)231454665 > 14076 CAEN Cedex > 05 > > ----------------------------------------------------------------------- > #ifndef __MyNuc_H > #define __MyNuc_H > > #include "TLorentzVector.h" > > class MyNuc : public TLorentzVector > { > UChar_t fZ; > UChar_t fA; > static Int_t fNb_Objects; > static TList* fObjList; > void AddToObjList(TObject*); > > public: > MyNuc(); > MyNuc(const MyNuc &); > MyNuc(int z, int a); > virtual ~MyNuc(); > > void SetZ(int z){fZ=(UChar_t)z;} > void SetA(int a){fA=(UChar_t)a;} > Int_t GetZ() const; > Int_t GetA() const; > Int_t GetNbObj(Option_t *opt=""); > void SetPxPyPz(Float_t px, Float_t py, Float_t pz); > void Clear(Option_t *opt=""); > > ClassDef(MyNuc,1) // Just for tests > }; > > #endif > > ----------------------------------------------------------------------- > #include "MyNuc.h" > #include <Riostream.h> > > ClassImp(MyNuc) > > //__________________________________________________________________ > //MyNuc > //For testing TClonesarray behaviour > // > > Int_t MyNuc::fNb_Objects=0; > TList *MyNuc::fObjList=0; > > MyNuc::MyNuc() > { > cout << " ++ Calling default ctor ++ " << endl; > fZ = fA = 0; > fNb_Objects++; > cout << "Calling AddToObjList..." << endl; > AddToObjList(this); > } > > void MyNuc::AddToObjList(TObject* obj) > { > //Add pointer to object to static list if the pointer is not already in the list > cout << "AddToObjList............" << endl; > if(!fObjList) { > cout << "Creating object list...." << endl; > fObjList=new TList; > } > if(obj){ > if(!fObjList->FindObject(obj)) fObjList->Add(obj); > } else { > cout << "(the 'this' pointer is NULL)........." << endl; > } > cout << "done" << endl; > } > > MyNuc::MyNuc(int z, int a) > { > fZ = (UChar_t)z; > fA = (UChar_t)a; > fNb_Objects++; > AddToObjList(this); > } > > MyNuc::MyNuc(const MyNuc &obj) > { > fZ = obj.GetZ(); > fA = obj.GetA(); > fNb_Objects++; > AddToObjList(this); > } > > MyNuc::~MyNuc() > { > fNb_Objects--; > if(!fNb_Objects) delete fObjList; > } > > Int_t MyNuc::GetZ() const > { > return (Int_t)fZ; > } > > Int_t MyNuc::GetA() const > { > return (Int_t)fA; > } > > Int_t MyNuc::GetNbObj(Option_t *opt) > { > if(strcmp(opt,"")) cout << "fNb_Objects=" << fNb_Objects << ", size of list=" << fObjList->GetSize() << endl; > return fNb_Objects; > } > > void MyNuc::Clear(const Option_t *opt) > { > TLorentzVector::Clear(opt); > fZ=fA=0; > } > > void MyNuc::SetPxPyPz(Float_t px, Float_t py, Float_t pz) > { > Float_t mass = 931.5*GetA(); > TLorentzVector::SetXYZM(px,py,pz,mass); > } > > ----------------------------------------------------------------------- > #include "MyNuc.h" > #include "TClonesArray.h" > > void test() > { > MyNuc a; > a.GetNbObj("print"); > > TClonesArray tca("MyNuc", 50); > > tca.ExpandCreate(5); > a.GetNbObj("print"); > tca.Clear("C"); > > tca.ExpandCreate(3); > a.GetNbObj("print"); > tca.Clear("C"); > > tca.ExpandCreate(5); > a.GetNbObj("print"); > tca.Clear("C"); > }
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET