Re: Just another SEGV ...

From: Fons Rademakers (rdm@pcsalo.cern.ch)
Date: Tue Aug 17 1999 - 19:09:42 MEST


Hi Volker,

   when following Masa's recipe and it still crashes it is easy
to test if it is related to the ROOT custom new/delete. Just
compile your app without the ROOT libNew. On how to do that
see the $ROOTSYS/test/Makefile and add to the root-config statemenet
--nonew, like: root-config --nonew -libs

Let us know.

Cheers, Fons.

> 
> Dear Volker,
> 
> I suspect both problems have the same root cause. I haven't been able
> to look into the detail, it is likely that combination of compiled class
> and interpreted class has something to do.  Can you avoid following cases?
> 
>    // Interpreted class inherits from Compiled class
>    class Interpreted : public Compiled {
>    };
> 
>    // Interpreted class has Compiled class object as a member
>    class Compiled;
>    class Interpreted {
>      Compiled x;
>    };
> 
> In theory, above should work, but there is a risk associated with
> operator new/delete.  Instead, please try following.
> 
>    class Compile;
>    class Interpreted {
>      Compiled *p;
>     public:
>      Interpreted() { p = new Compiled; }
>      ~Interpreted() { delete p; }
>    };
> 
> Could you implement EMModule in this way?
> 
> The problem can be deeper than it looks at glance. In C++, what looks
> simple can be a mess in the back.
> 
> I hope this can be fixed in Root/cint, but can not say for sure.
> If problem comes from conflicting 'operator new/delete' definition
> between the standard library and Root library there is not much 
> we can do.
> 
> Thank you
> Masaharu Goto
> 
> ------------------------------------------------------------------
> Hi,
> 
> again, I had a problem with a segmentation violation:
> 
> Assuming the class EMModule from my previous mails, I introduced the
> following class:
> 
> [...]
> 
> class EMCalo {
>  private:
>   EMModule *Modules;
>   
>  public:
>   EMCalo(int modnum = 1000);
>   ~EMCalo();
>   void ReadCalFile(char* n);
> };
> 
> [...]
> 
> EMCalo::EMCalo(int modnum) {
>   Modules = new EMModule[modnum];
> }
> 
> EMCalo::~EMCalo() {
>   delete Modules;
> }
> 
> void EMCalo::ReadCalFile(char *n) {
>   Int_t         Rn, Mn, Nn;
>   Float_t       x,y,z,size;
>   
>   ifstream setup(n);
>   while (!setup.eof()) {
>     setup >> Rn;
>     setup >> Mn;
>     setup >> x >> y >> z >> size;
>     cout << Rn << " " << Mn << " "
>          << x  << " " << y  << " " 
>          << z  << " " << size << endl;    
> 
>     Nn = 60*Rn + Mn;
>     Modules[Nn] = EMModule(x,y,z,size);
>   }
>   setup.close();
>   delete setup;      
> }
>          
> In root, the following happens:
> 
> root [2] EMCalo *test = new EMCalo(1000);
> root [3] test->ReadCalFile("current_setup.par");
> 1 1 -11.8659 59.6538 226.993 12.2465
> 1 2 -33.7912 50.572 226.993 12.2465
> 
>  *** Break *** segmentation violation
> Root >
> root [4] test->ReadCalFile("current_setup.par");
> 1 1 -11.8659 59.6538 226.993 12.2465
> 1 2 -33.7912 50.572 226.993 12.2465
> 1 3 -50.572 33.7912 226.993 12.2465
> 1 4 -59.6538 11.8659 226.993 12.2465
> ...
> 13 58 60.7391 226.681 12.2989 12.2465
> 13 59 36.7117 231.789 12.2989 12.2465
> 13 60 12.2821 234.356 12.2989 12.2465
> 13 60 12.2821 234.356 12.2989 12.2465
> root [5]
> 
> That means, that the file could be read successfully the second
> (and third, ...) time, but not during the first call. After that,
> reloading of macros is no longer possible.
> 
> I thought, one the big advantages of root is, that one can build
> some analysis code in the frame of macros first and then, later on,
> they can be compiled and loaded as a shared library. This works,
> of course, but in the macro stage I get a lot of SEGV, which turn
> the advantage in a disadvantage again. 
> 
> Is this real or did I miss a very essential point? 
>  
> Thanks in advance and best reagrds,
> Volker
> 
> -- 
> Volker Hejny                    Tel: 02461/616853                      ** 
> Institut f. Kernphysik          Fax: 02461/613930                     **
> ---------------------------------------------------------------- **  ** ---  
> Forschungszentrum Juelich GmbH, D-52425 Juelich                    **
> 


-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:38 MET