> Hi Francois-Xavier, > > Up to ROOT version 3.02/03 included, it was not possible to create > objects in the default constructor (I mean new objects created by the > object being instantiated). With these versions of ROOT, reading one object > implied doing something like > Myclass *object = new MyClass(); > object->Streamer(buffer); > Hello Rene, What about a special ctor for each TObject subclasses within ClassDef Something like : protected: friend class TBuffer; MyClass(TBuffer &b){;} // or any other special signature, that the user doesn't use normally Then it can be used to serialize things: MyClass *object = new MyClass(buffer); object->Streamer(buffer); with no side effect. The class default ctor is used too heavy by C++ itself and it is a pain to take in account the extra constrains those imposed by ROOT. (especially when on needs to port some third party C++ class). Cheers, Valeri > In this case, Streamer will also create the sub-objects at the same pointer > address > than the original objects. When the destructor of Myclass was called, a seg > violation appeared. > Also the default constructor is called by operations like: > - calling Dump, Inspect, > - creating a context menu > in order to build the class dictionary in memory. > > In version 3.02/06 and 07, I have protected the case when an object is already > allocated (could also be a float*, int*, char*, etc). If a non-null pointer is > found, the object is automatically deleted when streaming in a new object. > So, with the new version, you can create new objects in the default constructor. > However, I would like to discourage this practice for performance reasons. > When you are in read mode, it is useless to create an object that is going to be > automatically deleted when reading from the buffer. > The performance penalty does not occur when the object is in a top branch > as it is the case for the Event example. > Version 3.02 also includes the option "->" in the data member field > of the class declaration. If you decide to create a sub-object in the class > constructor and you guarantee that the corresponding pointer is never null, > ROOT will merely not delete the object but instead use the direct form > subobject->Streamer(buffer); > instead of the more expansive form > buffer >> mysubobject; > > I know that this should be better explained in the Users Guide. > > Rene Brun > > > > GENTIT Francois-Xavier DAPNIA wrote: > > > > Dear rooters, > > In the documentation, p275, it is said: > > > > ROOT object I/O requires every class to have a default constructor...Be > > sure you do not allocate any space for embedded pointer in the default > > constructor. > > > > Now, if one looks at the Event.cxx example provided in root/test there are > > 2 "new" in the default constructorof the class Event? > > > > F.X. Gentit > > DAPNIA/SPP CEN Saclay > > tel : 01 69 08 30 38 fax : 01 69 08 64 28 > > web : http://home.cern.ch/~gentit/ >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET