Re: crash

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


Of course you can have an object destructor for your class, but should not call the destructor as you do from the class itself.

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:04:21 CEST

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