Erzeugung und Entfernung der Objekte

Nach der Ladung des mql5-Programms wird für jede Variable Speicher entsprechend dem Typ der Variable verteilt. Variablen werden in zwei Typen nach dem Zugang aufgeteilt  - globale Variablen und lokale Variablen, und nach den Speicherklassen: Eingabeparameter des mql5-Programms, statische und automatische. Jede Variable wird wenn notwendig durch den entsprechenden Wert initialisiert. Nach der Verwendung wird die Variable deinitialisiert und der von ihr verwendete Speicher kehrt zum ausführenden System MQL5.

Initialisierung und Deinitialisierung der globalen Variablen

Initialisierung der globalen Variablen erfolgt automatisch nach dem Laden des mql5-Programms und vor dem Aufruf jeder Funktion. Bei der Initialisierung erfolgt automatische Zuordnung der Initialwerte den Variablen einfacher Typen und wird der Konstrukteur für Objekte aufgerufen (wenn er vorhanden ist). Eingabeparameter werden immer auf dem globalen Niveau erklärt, durch die Werte initialisiert,die von Benutzern im Dialog beim Ausführungslauf des mql5-Programms.

Abgesehen davon, dass statische Variablen gewöhnlich auf dem lokalen Niveau erklärt werden, wird der Speicher für diese Variablen im voraus verteilt und Initialisierung erfolgt sofort nach der Ladung des Programms, wie auch für globale Variablen.

Ordnung der Initialisierung erfolgt der Ordnung der Erklärung der Variable im Programm und Deinitialisierung erfolgt umgekehrt vor der Ausladung des mql5-Programms. Diese Regel gilt nur für diejenigen Variablen, die nicht von der Anweisung new erzeugt wurden. Solche Variablen werden sofort nach der Ladung erzeugt und initialisiert, und unmittelbar vor der Ausladung werden sie deinitialisiert.  

Initialisierung und Deinitialisierung der lokalen Variablen

Wenn die Variable, die auf dem lokalen Niveau erklärt wird, nicht statisch ist, erfolgt die Speicherverteilung für eine solche Variable automatisch. Lokale Variablen, wie auch globale werden automatisch in dem Augenblick initialisiert, wenn während der Ausführung des Programms Erklärung der lokalen Variable erfolgt. So entspricht die Ordnung der Initialisierung der Ordnung der Erklärung.

Lokale Variablen werden am Ende des Programmblocks deinitialisiert, in dem sie erklärt wurden, und in der Reihenfolge, die ihrer Erklärung umgekehrt ist . Block eines Programms ist eine zusammengesetzte Anweisung, die ein Teil der Auswahlanweisung switch, Zuklusanweisung (for, while, do-while), Körper der Funktion oder Teil der Anweisung if-else sein kann.

Initialisierung der lokalen Variablen erfolgt nur in dem Moment, wenn während der Initialisierung des Programms Erklärung der Variable erfolgt. Wenn während der Programmausführung das Block, in dem die Variable erklärt wurde, nicht ausgeführt wurde, wird eine solche Variable nicht initialisiert.

Initialisierung und Deinitialisierung der dynamisch verteilten Objekte

Ein Besonderer Fall stellen Objektanzeiger dar, denn Erklärung des Anzeigers führt nicht zur Initialisierung des entsprechenden Objektes. Die dynamisch verteilten Objekte werden nur im Augenblick der Erzeugung des Klassenexemplares durch die Anweisung new. Initialisierung des Objektes setzt Aufruf des Konstruktors einer entsprechenden Klasse voraus. Wenn es keinen entsprechenden Konstruktor in der Klasse gibt, werden seine Glieder des einfachen Typs, automatisch nicht initialisiert; Glieder der Typen Zeile, dynamisches Feld und zusammengesetztes Objekt werden automatisch initialisiert.

Anzeiger können auf dem globalen und auf dem lokalen Niveau erklärt werden, und dabei durch einen leeren Wert NULL oder durch den Wert eines Anzeiger desselben oder des heritierten Typs initialisiert werden können. Wenn für den Anzeiger, der auf dem lokalen Niveau erklärt wurde, die Anweisung new aufgerufen wird, muss auch die Anweisung delete für diesen Anzeiger vor dem Ausgang vom diesen Niveau ausgeführt. Anderenfalls wird der Anzeiger verlorengehen und das Objekt kann nicht explizit entfernt werden.

Alle Objekte, die mittels des Ausdrucks Anzeiger_des Objektes=new Name_der Klasse erzeugt wurden, müssen im nachhinein mittels der Anweisung   delete(Anzeiger_des Objektes) entfernt werden. Wenn eine Variable dieser Art nach dem Beenden des Programms aus irgendwelchen Gründen von der Anweisung delete nicht entfernt wurde, wird darüber eine Meldung im Journal "Experten" ausgegeben. Man kann mehrere Variablen erklären und allen den Anzeiger eines Objektes zuordnen.

Wenn ein dynamisch erzeugtes Objekt Konstruktor hat, wird dieser Konstruktor aufgerufen werden während die Anweisung new ausgeführt wird . Wenn Objekt einen Destructor hat, wird er aufgerufen werden, während die Anweisung delete ausgeführt wird.

So werden dynamisch verteilte Objekte nur während der Ausführung durch die Anweisung new erzeugt und werden bestimmt entweder von der Anweisung delete oder vom automatisch ausführenden System MQL5 wenn das Programm ausgeladen wird. Ordnung der Erklärung der Anzeiger der dynamisch erzeugten Objekte beeinflusst die Ordnung ihrer Initialisierung nicht. Die Ordnung der Initialisierung und die Ordnung der Deinitialisierung werden vollständig vom Programmierer kontrolliert.

Arbeit mit dynamischen Speicher

Beim Arbeiten mit dynamischen Arrays wird der freigegebene Speicher unmittelbar an das System zurückgegeben.

Bei der Erstellung eines dynamischen Klassenobjekt durch new, wird der Speicher zuerst im Pool von Klassenspeicher, mit dem der Speicher-Manager arbeitet, gesucht, und wenn der Pool nicht genug Speicher hat, wird der Speicher im System angefordert. Wenn Sie ein dynamisches Objekt durch delete löschen, wird Speicher, der vom Objekt besetzt ist, in den Pool von Klassenspeicher zurückgegeben.

Der Speicher-Manager gibt den Speicher an das System zurück sofort nach der Ausgang aus der folgenden Event-Handler-Funktionen: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().

Kurzcharakteristik der Variablen

Hauptinformation über Erzeugung, Entfernung, Aufruf der Konstruktors und Destruktors werden in der Kurztabelle angegeben.


Globale automatische Variable

Lokale automatische Variable

Dynamisch erzeugtes Objekt

Initialisierung

sofort nach der Ladung des mql5-Programms

Beim Reichen des Kodes der Zeile, wo sie erklärt ist

bei Ausführung der Anweisung new

Ordnung der Initialisierung

in Form von Erklärung

in Form von Erklärung

unabhängig von der Ordnung der Erklärung

Deinitialisierung

vor der Ausladung des mql5-Programms

beim Ausgang der Ausführung aus dem Block der Erklärung

bei Ausführung der Anweisung delete oder vor Ausladung des mql5-Programms

Ordnung der Deinitialisierung

in der Reihenfolge, die der Initialisierung umgekehrt ist

in der Reihenfolge, die der Initialisierung umgekehrt ist

nicht abhängig von der Ordnung der Initialisierung

Aufruf des Konstruktors

bei Ladung des mql5-Programms

bei der Initialisierung

bei Ausführung der Anweisung new

Aufruf des Destruktors

bei Ausladung des mql5-Programms

beim Ausgang aus dem Block, in dem die Variable initialisiert wurde

bei Ausführung der Anweisung delete

Meldung über Fehler

Meldung im Journal "Experten" über den Versuch der Entfernung eines automatisch erzeugten Objektes

Meldung im Journal "Experten" über den Versuch der Entfernung eines automatisch erzeugten Objektes

Meldung im Journal "Experten" über nicht entfernte Objekte bei Ausladung des mql5-Programms

Sehen Sie auch

Datentypen, Inkapsulation und Erweiterungsfaehigkeit der Typen, Initialisierung der Variablen, Sichtbereich und Lebensdauer der Variablen, Erzeugung und Entfernung der Objekte