Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Programm mit END beenden...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 13.01.2014, 01:41    Titel: Programm mit END beenden... Antworten mit Zitat

Zum Beenden eine Programms mit END habe ich eine Frage:

Kann ich ein Programm problemlos an jeder Stelle des Codes mit END beenden?
Oder vielleicht besser anders gefragt: Unter welchen Umständen reicht es nicht aus, ein Programm mit END zu beenden?

Hintergrund ist der Satz aus der Befehls-Referenz "Wenn das Programm mit END beendet wird, dann werden Variablen und Speicher nicht automatisch zerstört".

Ich verstehe das so:
END beendet ein Programm, der für Programmcode und Variablen benötigte Speicher wird vollständig wieder frei gegeben.
Der nun freie Speicherbereich kann (wird) aber immer noch die Inhalte aus dem soeben beendeten Programm enthalten.

Ist meine Interpretation richtig?

Grüße
Rainer

Die Frage klingt etwas *blöd*, denn
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 13.01.2014, 08:38    Titel: Antworten mit Zitat

In der Regel räumt das Betriebssystem nach Programmende ja selbst auf.
Betroffen sind bei END alle eigenen Datentypen (UDTs), die in irgendeiner Form eigenen Speicher belegen (z. B. über ALLOCATE oder IMAGECREATE), der dann auch selbst wieder aufgeräumt werden muss. In der Regel läuft das über den UDT-Destruktor (siehe DESTRUCTOR) - dieser wird aber bei END nicht aufgerufen. Modul-Destruktoren dagegen schon.

Wie gesagt, normalerweise sollte trotzdem nichts schlimmes passieren, weil das Betriebssystem selbst aufräumt; zum sauberen Programmieren gehört es aber allemal, keinen Müll rumliegen zu lassen. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 13.01.2014, 14:11    Titel: Antworten mit Zitat

Wenn ich nochmal zu den UDTs nachfragen darf:

Bei UDT's, denen nicht mit ALLOCATE Speicher zugewiesen wird, sondern nur per DIM, wird durch ein END an irgendeiner beliebigen Stelle des Programms (also Beendigung auch auch in einer Sub oder Function möglich)
der komplette Speicherbereich wieder freigegeben?

Als z.B. so etwas:
Code:
Type Testtype
   I as Integer
   S as String
End Type

Dim Test(0 to 100) as Testtype

'...

END


Ist es bei einem so einfachen Beispiel sinnvoll, einen DESTRACTOR einzubauen??

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 13.01.2014, 20:01    Titel: Antworten mit Zitat

Es geht mir nicht um UDTs, die in einen ALLOCATE-Speicher gelegt werden (diese solltest du sowieso zum Programmende selbst zerstören), sondern um UDTs, die in ihrem Konstruktor selbst Speicher anlegen und im Destruktor wieder freigeben. Aber solange du solche Sachen nicht machst, musst du dir um END keine Sorgen machen.

Ansonsten scheint mir der Umgang mit END ein Stück weit eine Glaubensfrage zu sein. Wenn es umsetzbar ist, sollte man das Programm einfach am Ende auslaufen lassen. Allerdings ist das nicht immer möglich (zumindest solange man auf "GOTO ende" verzichten möchte ...)

Einen Destruktor zu bauen ist immer dann sinnvoll, wenn am Ende noch aufgeräumt werden muss - Speicherfreigabe z. B. (in deinem Mini-Beispiel nicht nötig), wenn die Daten weggespeichert werden müssen oder sonst irgend etwas in der Art. Verkettete Listen sind so ein Beispiel, wo er wegen Speicherfreigabe dringend nötig ist
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 14.01.2014, 02:01    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
...Aber solange du solche Sachen nicht machst, musst du dir um END keine Sorgen machen...


Danke für die Klarstellung.
Da ich nur Steinzeitcode schreibe oder vielmehr portiere, bin ich auf der sicheren Seite lächeln

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 14.01.2014, 10:01    Titel: Antworten mit Zitat

Früher in der Commodore Amiga-Zeit war dies noch ein relevantes Problem, dass ein inzwischen beendeter Prozess beispielsweise verwaiste Screens und Windows hinterlassen konnte... Hatte ich damals im AmigaBASIC hie und da gehabt: Während der interne Befehlssatz, sprich Interpreter/Laufzeitumgebung sich noch recht gut um ein Aufräumen beim Beenden kümmerte, konnte es bei einem "CALL AllocMem&" (direkt aufs Betriebssystem-API gehen) sehr schnell einmal verwaiste Ressourcen geben.

In der Zwischenzeit würde so etwas bereits als gröbere Sicherheitslücke im Betriebssystem gelten. Bestandteil vom heute üblichen Speicherschutz von User Space-Programmen ist es auch, Ressourcen zu überwachen und diese ggf. bei einem "taskkill /force" (Windows) bzw. "kill -9" (Linux) vollständig abzuräumen.

Grundsätzlich ist aber schon besserer Programmierstil, alles, was man angefordert hat, am Schluss auch wieder freizugeben, so dass die sich Software auch für ein Umfeld ohne Speicherschutz eignen würde.

Auf Kernel Mode-Ebene dagegen gibt es den Speicherschutz dagegen nicht; dort muss wie zu Beginn genannt sauber gearbeitet werden, denn fehlerhafte Treiber führen bekanntlich zum berühmt-berüchtigen Bluescreen (Windows) bzw. zu einer Kernel panic (Linux).

Zusammengefasst: Bei "normalen" Anwendungen wie FreeBasic-Programm im User Space profitiert man vom Betriebssystem von ziemlich starken Sicherheitsgurten, was überhaupt erst effiziente IDEs ermöglicht, ohne ständig Reboot-Abstürze zu riskieren, wie dies in der Amiga/MS-DOS-Zeit noch üblich war.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.01.2014, 10:27    Titel: Antworten mit Zitat

nemored: Da das OS sich selbst um die Freigabe des Speichers kümmert, sind verkettete Listen ein eher schlechtes Beispiel. Ein besseres wäre z.B. ein UDT, der die komplette Konfiguration des Programms enthält und diese im Destruktor z.B. in eine Konfigurationsdatei schreiben würde.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 14.01.2014, 14:16    Titel: Antworten mit Zitat

Zitat:
nemored: Da das OS sich selbst um die Freigabe des Speichers kümmert, sind verkettete Listen ein eher schlechtes Beispiel.

Das ist richtig - zumindest was den Befehl END angeht. Bei der Aussage ging es mir mehr um die allgemeine Notwendigkeit eines Destruktors, auch während des laufenden Programms. Eine temporär angelegte Liste soll natürlich nicht unbedingt bis zum Programmende Speicherplatz belegen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz