delete TMenuItem ?
-
hallo,
wollt ma wissen ob ich das so machen kann,
ich habe nen PopupMenu in dem ich dynamsich neue TMenuItem mit 'TMenuItem NewItem = new TMenuItem(PopupMenu1)'
erzeuge, ob ich die so dann einfach wieder bevor mein Programm beendet wird löschen kann mit delete ?
Jedenfalls sind die Einträge nach dieser Aktion nicht mehr vorhanden.//delete all TMenüItem int c = GetMenuItemCount(PopupMenu1->Handle); TMenuItem *mItem; for(c; c > 0; c--) { mItem = PopupMenu1->Items; delete mItem->operator [](c-1); }
-
...ein wirklich eigenartiges Konstrukt!
Warum so umständlich?
Warum verwendest du nicht die in der Klasse TMenuItem vorhandenen Funktionen?PopupMenu1->Items->Clear() löscht alle Menüeinträge.
PopupMenu1->Items->Delete(0) löscht den ersten Menüeintrag inklusive aller Untermenüs,
PopupMenu1->Items->Delete(1) löscht den zweiten Menüeintrag usw.Außerdem kannst du dir das Löschen der Einträge bei Programmende sparen.
Wenn beim Erstellen der Items der Owner übergeben wird (new TMenuItem(Owner)), dann löscht die VCL die Menü-Items automatisch.
Das Löschen einzelner Einträge macht nur Sinn, wenn das Menü umkonfiguriert werden muss.
-
danke füe die Info, war mir gar nicht bewusst das:
Wenn beim Erstellen der Items der Owner übergeben wird (new TMenuItem(Owner)), dann löscht die VCL die Menü-Items automatisch.
ist ja fein wenn das automatisch geschieht in dem Fall.
Ich dachte nur alles was mit new erzeugt wird belegt Speicher der mit delete auch wieder freigegeben werden muss.
Für die Freigabe des Speichers sodaß andere Programme diesen nutzen können ist der Programmierer selber verantwortlich.so habe ich das mal gelernt,
cu
-
Hallo
Grundsätzlich richtig.
Aber ein vernünftiges Framework wie die VCL benutzt Strukturen, um das manuelle Löschen unnötig zu machen. Bei der VCL ist dafür der Owner zuständig : Immer wenn eine Klasseninstanz im Konstruktor einen Owner ungleich 0 bekommt, wird der Owner seine Childs löschen. Auch die MenuItems werden automatisch vom Menu gelöscht.
Aber selbst wenn du die MenuItems manuell löschen willst, dann benutze bitte die genannten Methoden.Nur wenn diese Mechanismen nicht greifen, ist manuelles Löschen notwendig.Aber auch hier kann man mit Verwendung von Smartpointern das Löschen automatisieren.
Und in modernen Betriebssystemen seit Windows 2000 wird nach dem Beenden des Programmes der gesamte Speicher vom BS freigegeben, es gibt keine programmübergreifende Speicherlöcher mehr.
Jeder Programmierer sollte wissen, das zu einem new ein delete gehört. Aber ein guter Programmierer weiß, wie er vermeidet, das delete selber schreiben zu müßen.
bis bald
akari
-
akari schrieb:
Und in modernen Betriebssystemen seit Windows 2000 wird nach dem Beenden des Programmes der gesamte Speicher vom BS freigegeben, es gibt keine programmübergreifende Speicherlöcher mehr.
Das müßte auch in Windows 95 und auf jeden Fall in Windows NT 3.1 schon so gewesen sein.
akari schrieb:
Jeder Programmierer sollte wissen, das zu einem new ein delete gehört. Aber ein guter Programmierer weiß, wie er vermeidet, das delete selber schreiben zu müßen.
Exakt. Wer
delete
direkt benutzt, macht meistens etwas falsch.
-
Es ist grundsätzlich richtig und liegt in der Verantwortung des Programmierers, jeden allokierten Speicher auch wieder freizugeben.
Es schaded auch nicht, wenn manuell erstellte VCL-Instancen wieder manuell freigegeben werden.Die VCL hat aber einen eigenen Mechanismus, der dafür sorgt, dass beim Löschen einer Instance (Klasse) auch sämtliche anderen Instancen gelöscht werden, bei denen sie Owner ist.
Alle Instancen von VCL-Klassen, bei denen kein Owner übergeben werden kann, müssen immer manuell gelöscht werden!