Re: crash

From: Rene Brun <Rene.Brun_at_cern.ch>
Date: Thu, 14 Oct 2010 12:34:28 +0200


see below

Rene

Patrick Dupre wrote:
> On Thu, 14 Oct 2010, Rene Brun wrote:
>
>> Of course you can have an object destructor for your class, but
>> should not call the destructor as you do from the class itself.
> I have a destructor but it is just not called when I leave the
> application with gApplication->Terminate();
> In fact even every thing after
> theApp.Run () ;
> is ignored.
>

instead of

   theApp.Run();
use

   theApp.Run(kTRUE); //see doc

> there is at least one point that I am missing.
>
>>
>> Rene
>>
>> Patrick Dupre wrote:
>>> On Thu, 14 Oct 2010, Rene Brun wrote:
>>>
>>>> well! call a function like TestMainFrame::Close that includes most
>>>> of the stuff that you have currently in your destructor.
>>>
>>> This is hurting my C++ knowledges
>>> Is there a reason for not be able to use a "usual" object destructor
>>> for this sort of class ?
>>>
>>>>
>>>> Rene
>>>>
>>>> Patrick Dupre wrote:
>>>>> Hi Rene,
>>>>>
>>>>>>
>>>>>> You have a huge mistake in TestMainFrame:: ProcessMessage with
>>>>>> these statements
>>>>>> case M_FILE_CLOSE:
>>>>>> printf("deleteing the windows\n");
>>>>>> delete this; //THIS WRONG
>>>>>>
>>>>>> You cannot delete an object while you are executing it. To close
>>>>>> teh application simply replace the lines above by
>>>>>> case M_FILE_CLOSE:
>>>>>> printf("deleteing the windows\n");
>>>>>> gApplication->Terminate();
>>>>>>
>>>>> OK,
>>>>> but now how I use my destructor: TestMainFrame:: ~TestMainFrame()
>>>>> because gApplication->Terminate();
>>>>> terminates the application without going through the destructor !
>>>>>
>>>>> Thank.
>>>>>
>>>>>
>>>>>
>>>>>> see examples in $ROOTSYS/tutorials/gui/guitest.C
>>>>>
>>>>>>
>>>>>>
>>>>>> Patrick Dupre wrote:
>>>>>>> Hello,
>>>>>>>
>>>>>>> I took the following example on the root web site, but it
>>>>>>> crashes when I
>>>>>>> make a test close file.
>>>>>>> Why ?
>>>>>>>
>>>>>>>
>>>>>>> #include <stdio.h>
>>>>>>> #include <stdlib.h>
>>>>>>> #include <error.h>
>>>>>>> #include <string>
>>>>>>> #include <iostream>
>>>>>>>
>>>>>>> #include <TROOT.h>
>>>>>>> #include <TApplication.h>
>>>>>>> #include <TVirtualX.h>
>>>>>>> #include <TGListBox.h>
>>>>>>> #include <TGClient.h>
>>>>>>> #include <TGFrame.h>
>>>>>>> #include <TGMenu.h>
>>>>>>>
>>>>>>> //using namespace std ;
>>>>>>>
>>>>>>> enum values
>>>>>>> {M_FILE_OPEN, M_FILE_CLOSE, M_FILE_CANCEL, M_FILE_HELP_COMMAND };
>>>>>>>
>>>>>>> class TestMainFrame : public TGMainFrame
>>>>>>> {
>>>>>>> private:
>>>>>>> TGPopupMenu *menuTest, *menuHelp, *menuCancel;
>>>>>>> TGMenuBar *menubar;
>>>>>>> public:
>>>>>>> TestMainFrame(const TGWindow *pp, UInt_t w, UInt_t h);
>>>>>>> ~TestMainFrame();
>>>>>>>
>>>>>>> Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
>>>>>>> };
>>>>>>>
>>>>>>> TestMainFrame:: ~TestMainFrame()
>>>>>>> {
>>>>>>> printf("Deleting those objects ...wait a moment, please ...\n");
>>>>>>> delete menuTest;
>>>>>>> delete menuHelp;
>>>>>>> delete menuCancel;
>>>>>>> delete menubar;
>>>>>>> }
>>>>>>>
>>>>>>> TestMainFrame::TestMainFrame(const TGWindow *pp, UInt_t w,
>>>>>>> UInt_t h) : TGMainFrame(pp,w,h)
>>>>>>> {
>>>>>>>
>>>>>>> menuTest = new TGPopupMenu(gClient->GetRoot());
>>>>>>> menuTest->AddLabel("This is to open the window !!");
>>>>>>> menuTest->AddEntry("&Close file ", M_FILE_CLOSE);
>>>>>>>
>>>>>>> menuCancel = new TGPopupMenu(gClient->GetRoot());
>>>>>>> menuCancel->AddLabel("This is to cancel the window !!");
>>>>>>> menuCancel->AddEntry("&cancel ",M_FILE_CANCEL);
>>>>>>>
>>>>>>> menuHelp = new TGPopupMenu(gClient->GetRoot());
>>>>>>> menuHelp->AddEntry("&help ", M_FILE_HELP_COMMAND);
>>>>>>>
>>>>>>> menuHelp->Associate(this);
>>>>>>> menuCancel->Associate(this);
>>>>>>> menuTest->Associate(this);
>>>>>>>
>>>>>>> TGLayoutHints *barLayout = new
>>>>>>> TGLayoutHints(kLHintsTop|kLHintsLeft
>>>>>>> |kLHintsExpandX,0,0,1,1);
>>>>>>> TGLayoutHints *TestCancel = new
>>>>>>> TGLayoutHints(kLHintsTop|kLHintsLeft,0,4,0,0);
>>>>>>> TGLayoutHints *help = new TGLayoutHints(kLHintsTop|kLHintsRight);
>>>>>>>
>>>>>>> menubar = new TGMenuBar(this, 1,1, kHorizontalFrame);
>>>>>>> menubar->AddPopup("&Test ", menuTest, TestCancel);
>>>>>>> menubar->AddPopup("&Cancel ", menuCancel, TestCancel);
>>>>>>> menubar->AddPopup("&Help ",menuHelp, help);
>>>>>>> AddFrame(menubar, barLayout);
>>>>>>>
>>>>>>> //-----------------------------------------------------------------
>>>>>>> MapSubwindows();
>>>>>>> Resize(GetDefaultSize());
>>>>>>> MapWindow();
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> Bool_t TestMainFrame:: ProcessMessage(Long_t msg, Long_t parm1,
>>>>>>> Long_t parm2)
>>>>>>> {
>>>>>>> switch(GET_MSG(msg))
>>>>>>> {
>>>>>>> case kC_COMMAND:
>>>>>>> switch(GET_SUBMSG(msg))
>>>>>>> {
>>>>>>> case kCM_MENU:
>>>>>>> switch(parm1)
>>>>>>> {
>>>>>>> case M_FILE_CLOSE:
>>>>>>> printf("deleteing the windows\n");
>>>>>>> delete this;
>>>>>>> break;
>>>>>>> default:
>>>>>>> break;
>>>>>>> }
>>>>>>>
>>>>>>> default:
>>>>>>> break;
>>>>>>> }
>>>>>>> default:
>>>>>>> break;
>>>>>>> }
>>>>>>> return kTRUE;
>>>>>>> }
>>>>>>>
>>>>>>> using namespace std ;
>>>>>>>
>>>>>>> int main (int argc, char **argv) {
>>>>>>> TApplication theApp ("App", &argc, argv) ;
>>>>>>> TestMainFrame mainWindow (gClient -> GetRoot (), 800, 400) ;
>>>>>>> cout << "Before the App.run\n" ;
>>>>>>> theApp.Run () ;
>>>>>>> cout << "After theApp.run\n" ;
>>>>>>> return 0 ;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>
Received on Thu Oct 14 2010 - 12:34:33 CEST

This archive was generated by hypermail 2.2.0 : Thu Oct 14 2010 - 17:50:01 CEST