IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

wxWidget new and delete


Sujet :

wxWidgets

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut wxWidget new and delete
    Bonjour,

    je suis entrain de me poser la question suivante, est-ce que chaque objet créer par new à besoin de son delete. Sachant que je suis plus un programeur C, et que chaque malloc a besoin de son free... j'étais entrain de me demander pourquoi dans la plus part des exemples que je trouve il n'y a jamais de delete.

    Par exemple dans le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    PropertiesFrame::PropertiesFrame(wxWindow *parent,const wxPoint& pos)
    :wxFrame(parent,wxID_ANY,_T("Properties"),pos,wxSize(600,400))
    {
            wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
            sizer->Add(getMainPanel());
    	this->SetSizer(sizer);
    	this->Layout();
    }
    
    PropertiesFrame::~PropertiesFrame()
    {
    #AUCUN DELETE ICI (Normal ou pas ???)
    }
    
    wxPanel* PropertiesFrame::getMainPanel()  {
    	wxPanel *panel = new wxPanel(this);
    	wxFlexGridSizer *sizer = new wxFlexGridSizer(2,2, 3, 20);
    	sizer->AddGrowableCol(1);
    
    	wxStaticText *st1 = new wxStaticText(panel, wxID_ANY, wxT("Server Port"));
    	wxTextCtrl *tc1 = new wxTextCtrl(panel,wxID_ANY,_T("6666"));
    	sizer->Add(st1);
    	sizer->Add(tc1,1,wxEXPAND);
    
    
    	wxStaticText *st2 = new wxStaticText(panel, wxID_ANY, wxT("Events File"));
    	wxTextCtrl *tp2 = new wxTextCtrl(panel,wxID_ANY,_T("C:\\events.log"));
    	sizer->Add(st2);
    	sizer->Add(tp2,1,wxEXPAND);
    
    	panel->SetSizer(sizer);
    	panel->Layout();
    
    	return panel;
    }
    Il y a donc 7 new et aucun delete... que dois-je faire ???

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Les objets GUI de wxWidgets sont particuliers, ils s'auto-detruisent automatiquement (delete this lorsqu'ils reçoivent un évènement DESTROY. On ne doit donc pas les déléter manuellement.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    Okay ca c'est cool car ca facilite bien du travail...

    Par contre une question ???
    Si je ferme une fenetre par exemple, mon pointeur sur cette frame n'est pas NULL mais sont contenue oui... Comment faire pour que le pointeur soit lui aussi mis a NULL, car je n'arrive pas a detecter si cette fenetre a été fermée ou pas...??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class MainFrame: public wxFrame {
        MainFrame()
        OnOpenPropFrame(wxCommandEvent& WXUNUSED(event)) 
        PropertiesFrame *propf;
    }
     
    ...
     
    MainFrame::MainFrame()
        :wxFrame((wxFrame *)NULL, wxID_ANY, _T("MainFrame")), prop(NULL)
    {
    ...
    }
     
    void MainFrame::OnOpenPropFrame(wxCommandEvent& WXUNUSED(event)) {
     
        if(propf==NULL) {
             //Open a frame
             propf = new PropertiesFrame();
             propf->Show(true);
        }
        else {
             wxASSERT_MSG( (prop != NULL), _T("object should not be NULL in OnPropertie()!") );
             propf->Raise();  //put the current frame on the top
        }
    }
    Donc si j'ouvre une fois propf, je le ferme et je veux l'ouvrir une deuxième fois, mon programme plante a la commande propf->Raise();

    le stack
    Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.)
    16 <symbol is not available> 0xfeeefeee

    les variable
    • prop 0x03226e30
      • wxFrame 0x00000000
      • s400_manager 0xfeeefeee
        • wxPanel 0x00000000
      • sm_eventTableEntries 0x00952060
      • sm_eventTable {...}
      • sm_eventHashTable {...}


    Pour résumer je veux faire en sorte, que la fenêtre properties s'ouvre en un seul exemplaire!!! et que si elle existe déjà la mettre ON TOP avec la fonction raise.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En fait, tu dois récupérer la signalisation de la fermeture de ta fenêtre propf pour réinitialiser ton pointeur à NULL.
    Mais, le mieux c'est de ne pas avoir de membre PropertiesFrame *propf; ! Quand tu en as besoin, tu la cherche dans les fenêtres filles (wxWindow::FindWindow) et si tu ne la trouves pas, tu la crées.
    Avoir un membre, c'est faire doublon avec wxWidget et prendre le risque de ne pas être synchrone (la preuve, ton post...).

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    Ahh bein c'est vraiment bcp plus pratique comme méthode...

    donc au final, j'ai pas besoin de m'occuper des delete et de garder certain pointeurs en doublons
    C'est vrais que ca facilite bcp de chose pour gerer les events

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  2. Surdéfinition de new et delete
    Par couet dans le forum C++
    Réponses: 3
    Dernier message: 09/02/2007, 15h19
  3. surdefinition operateur new et delete
    Par johjoh dans le forum C++
    Réponses: 23
    Dernier message: 08/12/2006, 10h10
  4. intrigue sur la surcharge du new et delete
    Par swirtel dans le forum C++
    Réponses: 12
    Dernier message: 07/09/2006, 15h23
  5. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo