Hello, I have observed strange destructor behavior for an object I wrote. (I have included a simple class that demonstrates the problem): 1. If the interpreted object is created on the stack, it usually causes root to crash, but not always - see two root sessions below (taken in sequence w/out any intervening commands) 2. Problem does NOT occur if object is created on the heap when I delete it 3. The problem does NOT occur when I compile (e.g. replace .L test.cpp w/ .L test.cpp++) I am using Root V3.2/07 on Windows XP. Any idea why this behavior? Thanks, Ed Oltman ================ sample root sessions ================== C:\BowlV>root the current keyboard layout is 437 ******************************************* * * * W E L C O M E to R O O T * * * * Version 3.02/07 10 January 2002 * * * * You are welcome to visit our Web site * * http://root.cern.ch * * * ******************************************* Compiled for win32. CINT/ROOT C/C++ Interpreter version 5.15.25, Jan 6 2002 Type ? for help. Commands must be C++ statements. Enclose multiple statements between { }. root [0] .L test.cpp root [1] Demo p root [2] TCanvas *c = new TCanvas() root [3] p.Make() ********** ** 1 **SET ERR 1 ********** root [4] p.Draw() root [5] .q C:\BowlV>root the current keyboard layout is 437 ******************************************* * * * W E L C O M E to R O O T * * * * Version 3.02/07 10 January 2002 * * * * You are welcome to visit our Web site * * http://root.cern.ch * * * ******************************************* Compiled for win32. CINT/ROOT C/C++ Interpreter version 5.15.25, Jan 6 2002 Type ? for help. Commands must be C++ statements. Enclose multiple statements between { }. root [0] .L test.cpp root [1] Demo p root [2] TCanvas *c = new TCanvas() root [3] p.Make() ********** ** 1 **SET ERR 1 ********** root [4] p.Draw() root [5] .q Error: Symbol i is not defined in current scope FILE:C:\BowlV\test.cpp LINE:27 *** Interpreter error recovered *** C:\BowlV> --Then I get a "root.exe has encountered a problem and needs to close..." box... ================ demonstration class ================== #include <string.h> #include <stdio.h> #include <stdlib.h> #include "TGraph.h" #include "TCanvas.h" #include "TPad.h" #include "TROOT.h" #include "TF1.h" class Demo { private: TGraph *m_pGraph[3]; bool noCanvas(); public: Demo(); ~Demo(); void Make(); void Draw(); #if !defined(__CINT__) || defined(__MAKECINT__) ClassDef(Demo,0) #endif }; #if !defined(__CINT__) || defined(__MAKECINT__) ClassImp(Demo) #endif Demo::Demo() { for (int i=0;i<3;i++) m_pGraph[i]=0; } Demo::~Demo() { for(int i=0;i<3;i++)if (m_pGraph[i]) delete m_pGraph[i]; } void Demo::Make() { double x[20],y[20]; for(int i=0;i<20;i++) x[i] = 6.283*i/20.; for(i=0;i<3;i++) { if (m_pGraph[i]) delete m_pGraph[i]; for(int j=0;j<20;j++) y[j] = sin(x[j] + .5*i); m_pGraph[i] = new TGraph(20,x,y); m_pGraph[i]->SetMarkerColor(1+i); m_pGraph[i]->SetMarkerStyle(20); // now, fit graph... TF1 *pf = new TF1("fit","sin(x+[0])",0.,6.283); m_pGraph[i]->Fit(pf,"qw"); delete pf; } } void Demo::Draw() { if (noCanvas()) return; gPad->GetCanvas()->Clear(); m_pGraph[0]->Draw("AP"); for(int i=1;i<3;i++) { m_pGraph[i]->Draw("P"); } } bool Demo::noCanvas() { if (gROOT->GetListOfCanvases()->IsEmpty()) { printf(" No canvas exists: Please create one...\n"); return true; } return false; }
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET