[gelöst] Speicherfreigabe beim Löschen von einem Menüpunkt (wxWidgets)



  • Hallo,

    ich weiß nicht ob das jetzt eine wxWidgets-Frage, eine Windowsfrage oder eine C++-Frage ist. Bitte nötigenfalls verschieben.

    Ich erzeuge dynamisch einen Menüpunkt

    MyFrame::Hinzu()
    {
      wxMenu* meinMenu = new wxMenu();
      meinMenu->Append(wxNewId(),_T("Neuer Punkt"));
      // Hauptmenu ist über die Klasse bekannt
      HauptMenu->Append(meinMenu,_T("Ein Untermenu"));
    }
    MyFrame::Weg()
    {
      // Hautpmenu ist über die Klasse bekannt
      wxMenu *removed = HauptMenu->Remove(HauptMenu->FindMenu(_T("Ein Unermenu")));
      delete removed;
      removed = NULL
    }
    MyFrame::MyFrame()
    {
      HauptMenu = new wxMenuBar();
      SetMenuBar(HauptMenu);
      Hinzu();
      Weg();
    }
    

    Der Befehl Remove gibt einen Zeiger auf das Menü das gelöscht wurde zurück um es zu löschen.

    Doku wxMenuBar schrieb:

    Removes the menu from the menu bar and returns the menu object - the caller is responsible for deleting it.

    Ich hab jetzt einmal den Task-Manager von Windows aufgemacht und gesehen, dass wenn ich den Hinzu() ausführe, dann benötigt mein Programm mehr Speicher (logisch). Wenn allerdings mein Weg() aufgerufen wird, dann verringert sich der Speicherbedarf nicht. Obwohl ich den Menüpunkt doch per delete gelöscht und den Zeiger auf NULL gesetzt habe.

    Habe ich einen Programmierfehler? Ist es normal, dass der Speicher nicht wieder frei gegeben wird (für evtl. neue Zeiger)? Ist das was von Windows und das wäre unter Linux anders?

    Wenn ich das Programm im Debugger starte, dann sehe ich nach dem delete-Befehl immer noch eine Speicher-Adresse (0x00ed97b0) und im Lokal bei removed immer noch ein vollständiges Objekt.

    Kann mir jemand bitte Auskunft darüber geben wie das gehandhabt wird?
    Danke schön schon mal,
    Stefan



  • Der Taskmanager ist kein verlässliches Tool um Speicherlecks oder ähnliches zu finden oder zu debuggen. Benutzt du Visual Studio? Wenn ja, debug deine Anwendung bzw starte sie per Debugger. Dieser wird dir bei wxWidgets automatisch die Speicherlecks melden wenn er welche findet. ( im Outputwindow )
    rya.



  • Danke, das ist ein super Tipp.
    Ich nehme mal an, ich hab schon eins gefunden:

    Detected memory leaks!
    Dumping objects ->
    {8492} normal block at 0x00ED9AF0, 24 bytes long.
     Data: < h              > F0 68 16 00 FF FF FF FF 00 00 00 00 00 00 00 00
    

    Jetzt muss ich nur noch rausfinden, wo das Problem entsteht.




Anmelden zum Antworten