Speicherfrage zu nicht-modalen Dialog



  • Hallo, mich würde mal etwas über die Speichererzeugung und Freigabe von nicht-modalen Dialogen interessieren.

    Wenn ich einen modalen Dialog erzeuge, mache ich das folgendermaßen. Der Speicher wird dann ja sofort nach der Initialisierung wieder freigegeben:

    CTestDialog *dlgTest;
    dlgTest = new CTestDialog();
    dlgTest->DoModal();
    delete [] dlgTest;
    

    Bei einem nicht-modalen Dialog, würde ich das folgendermaßen machen:

    CTestDialog *dlgTest;
    dlgTest = new CTestDialog();
    dlgTest->Create(IDD_TEST, this);
    

    Nun kann ich aber nicht gleich

    delete [] dlgTest;
    

    danach folgen lassen, da sonst der Dialog sofort geschlossen wird. Muss ich den Speicher für diesen Dialog freigeben und wenn ja wie und wo im Programmablauf? 😕



  • Hi,

    leg den Dialog als Membervariable der Aufrufenden Klasse an. Im Destruktor der Klasse kannst du ihn dann löschen. Eine andere Methode wäre, wenn du den Dialog einfach im Stack erzeugst (also ohne "new" und "*").

    Exceeder



  • und delete [] ist nur für arrays.



  • @Exceeder: Danke für die Antwort! Na ja, ich hab gelesen, dass man Dialoge usw. im Heap anlegen sollte. Wie würde das aussehen, wenn ich den Dialog im Stack erzeuge?
    So in etwa:

    CTestDialog dlgTest;  
    dlgTest.Create(IDD_TEST, this);
    

    Dann brauche ich ja auch nicht den Speicher wieder freigeben, oder?
    Komisch war halt nur, dass ich davor meine Dialoge nicht nach meiner ersten Methode initialisiert habe. Das hat dann, nachdem ich mein Programm und die entsprechenden Dialoge öfter aufgerufen habe, zu Speicherproblemen und zum Absturz geführt.

    @array: Reicht es also, wenn ich

    delete dlgTest;
    

    schreiben würde bzw. hat es irgendwelche nachteiligen oder keine Auswirkungen wenn ich die eckigen Klammern hinter den delete-Befehl setze?



  • genau so ist es richtig. wenn du delete[] benutzt ist das Verhalten undefiniert. Es wird zwar vielleicht funktionieren, ist aber falsch.



  • Die sauberste Lösung ist meiner Meinung nach folgende :

    CTestDialog *dlgTest; 
    dlgTest = new CTestDialog(); 
    dlgTest->Create(IDD_TEST, this);
    

    Im Klassenassi fügst Du beim CTestDialog folgende Funktion hinzu :

    void CTestDialog::PostNcDestroy() 
    {
    	delete this;
    	CDialog::PostNcDestroy();
    }
    

    So wird dat Dingens gekillt wenn es geschlossen wird und als C++ - Entwickler ist man sowieso glücklicher, wenn man sich selbst kümmert. 🙂

    Grüße

    BOA



  • @array: Ok, danke...bei mir hat es halt auch so mit der eckigen Klammer funktioniert, da ich nicht wusste, dass sich diese Angabe auf Arrayelemente bezieht.

    @BOA: Das sieht aber nach einer eleganten Lösung aus! 😃
    Mal noch ne weitere Frage an dich:
    Würdest du es für sinnvoll erachten, dass ich auch bei meinen modalen Dialogen die delete-Anweisung in die PostNcDestroy-Funktion aufnehme, oder ist es ok wie ich es am Anfang meines Postings beschrieben habe?



  • Die modalen Dialoge bearbeite ich wie Du es machst.

    Dialog aufgemacht
    Dialog zugemacht
    Dialog gelöscht
    Dialog erledigt

    Finde ich persönlich am schönsten, weil ich an einer Quellcodestelle mich um alles kümmere, von der Geburt bis zum Tod. 😉

    Ob das Speicher- oder Performance-Nach oder Vorteile bringt vermag ich net zu sagen ( glaube ich aber net wirklich ).

    Beste Grüße

    BOA


Anmelden zum Antworten