Creazione ed Eliminazione di oggetti

Dopo che un programma mql5 viene caricato per l'esecuzione, la memoria viene allocata per ogni variabile in base al tipo. Secondo il livello di accesso tutte le variabili sono divise in due tipi - variabili globali e variabili locali. Secondo la classe di memoria esse possono essere parametri di input di un programma mql5, static ed automatic. Se necessario, ciascuna variabile è inizializzata da un valore corrispondente. Dopo essere stata utilizzata, una variabile viene unintialized e la memoria utilizzata viene restituita al sistema eseguibile mql5.

Inizializzazione e deinizializzazione di Variabili Globali

Le variabili globali vengono inizializzate automaticamente subito dopo che un programma mql5 viene caricato e prima che qualsiasi funzione venga chiamata. Durante l'inizializzazione i valori iniziali vengono assegnati alle variabili di tipo semplice ed un costruttore (se c'è) è chiamato per gli oggetti. Le Variabili di input sono sempre dichiarate a livello globale, e vengono inizializzati da valori impostati da un utente nella finestra di dialogo durante l'avvio del programma.

Nonostante il fatto che le variabili static vengono solitamente dichiarate a livello locale, la memoria per queste variabili viene pre-assegnata, e l'inizializzazione viene eseguita subito dopo che un programma viene caricato, lo stesso per le variabili globali.

L'ordine di inizializzazione corrisponde all'ordine dichiarazione della variabile nel programma. La deinizializzazione avviene in ordine inverso. Questa regola vale solo per le variabili che non sono stati create dal nuovo operatore. Tali variabili vengono create ed inizializzate automaticamente subito dopo il caricamento, e vengono deinizializzate prima del decaricamento del programma .

Inizializzazione e Deinizializzazione di Variabili Locali

Se una variabile dichiarata a livello locale non è una static, la memoria viene allocata automaticamente per tale variabile. Le variabili locali, oltre a quelle globali, vengono inizializzate automaticamente nel momento in cui l'esecuzione del programma incontra la dichiarazione di una variabile locale. Così l'ordine di inizializzazione corrisponde all'ordine di dichiarazione.

Le variabili locali vengono deinizializzate alla fine del blocco del programma nel quale sono state dichiarate, ed in senso opposto alla loro dichiarazione. Un blocco del programma è un operatore composto che può essere una parte dell' operatore di selezione switch, l'operatore ciclico (for, while, do-while), il corpo di una funzione o una parte dell' operatore if-else.

Le variabili locali vengono inizializzate solo nel momento in cui l'esecuzione del programma incontra la dichiarazione della variabile. Se durante l'esecuzione del programma, il blocco in cui viene dichiarata la variabile non è stato eseguito, tale variabile non viene inizializzata.

Inizializzazione e Deinizializzazione di Oggetti Piazzati

Un caso particolare è quello con i puntatori ad oggetto, perché la dichiarazione di un puntatore non comporta l'inizializzazione di un oggetto corrispondente. Oggetti dinamicamente posizionati vengono inizializzati solo nel momento in cui il campione della classe viene creato dall' operatore new. L' inizializzazione di oggetti presuppone la chiamata di un costruttore di una classe corrispondente. Se non vi è alcun costruttore corrispondente nella classe, i suoi membri di un tipo semplice non verranno automaticamente inizializzati; membri dei tipi string, array dinamico ed oggetto complesso vengono inizializzati automaticamente.

I puntatori possono essere dichiarati a livello locale o globale, e possono essere inizializzati con il valore vuoto di NULL o il valore del puntatore dello stesso tipo o ereditato. Se l' operatore new viene chiamato per un puntatore dichiarato a livello locale, l' operatore delete per questo puntatore deve essere eseguito prima di uscire dal livello. In caso contrario, il puntatore verrà perso e l'eliminazione esplicita dell'oggetto avrà esito negativo.

Tutti gli oggetti creati dall'espressione di object_pointer =new Class_name, devono essere quindi eliminati per l'operatore delete(object_pointer). Se per qualche motivo tale variabile non viene eliminata dall' operatore delete quando il programma è completato, la voce corrispondente apparirà nel journal "Experts". Si possono dichiarare più variabili ed assegnare un puntatore di un oggetto a tutte loro.

Se un oggetto creato dinamicamente ha un costruttore, questo costruttore verrà chiamato al momento dell'esecuzione dell'operatore new. Se un oggetto ha un distruttore, verrà chiamato durante l'esecuzione dell' operatore delete.

Così oggetti dinamicamente piazzati, vengono creati solo nel momento in cui vengono creati dall'operatore new, e sono cancellati in modo assicurato, dall'operatoredelete o automaticamente dal sistema di esecuzione MQL5 durante il decarico del programma. L'ordine di dichiarazione di puntatori di oggetto creato dinamicamente non influenza l'ordine di inizializzazione. L'ordine di inizializzazione e deinizializzazione è interamente controllato dal programmatore.

Allocazione dinamica della memoria in MQL5

Quando si lavora con gli array dinamici, la memoria liberata viene immediatamente restituita al sistema operativo.

Quando si lavora con oggetti di classe dinamici utilizzando l' operatore new, dapprima la memoria viene richiesta dal pool della memoria della classe con cui il gestore della memoria sta lavorando. Se non c'è abbastanza memoria nel pool, la memoria viene richiesta dal sistema operativo. Quando si elimina l'oggetto dinamico utilizzando l' l'operatore delete, la memoria liberata viene immediatamente restituica al pool di memoria della classe.

Il gestore della memoria restituisce la memoria indietro al sistema operativo immediatamente dopo l'uscita delle seguenti funzioni event handling: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().

Brevi caratteristiche delle Variabili

Le principali informazioni riguardo l'ordine di creazione, eliminazione, riguardo chiamate di costruttori e distruttori è riportato nella tabella che segue.


Variabile automatica globale

Variabile automatica locale

Oggetto creato dinamicamente

Inizializzazione

subito dopo viene caricato un programma mql5

quando la linea di codice in cui viene dichiarato viene raggiunta durante l'esecuzione

all'esecuzione dell' operatore new

Ordine di Inizializzazione

nell'ordine di dichiarazione

nell'ordine di dichiarazione

indipendentemente dall'ordine della dichiarazione

Deinizializzazione

prima che un programma mql5 viene decaricato

quando l'esecuzione esce dal blocco di dichiarazione

quando l'operatore delete viene eseguito o prima che un programma mql5 venga decaricato

Ordine di Deinizializzazione

nell'ordine opposto all'ordine di inizializzazione

nell'ordine opposto all'ordine di inizializzazione

indipendentemente dall'ordine di inizializzazione

Chiamata costruttore

al caricamento del programma mql5

all'inizializzazione

all'esecuzione dell' operatore new

Chiamata distruttore

al decaricamento del programma mql5

quando esce dal blocco in cui è stata inizializzata la variabile

all'esecuzione dell'operatore delete

Logs Errore

log dei messaggi sul journal "Experts" al tentativo di eliminare un oggetto creato automaticamente

log dei messaggi sul journal "Experts" al tentativo di eliminare un oggetto creato automaticamente

log dei messaggi sul journal "Experts" in merito ad oggetti dinamicamete creati non-eliminati al decarico di un programma MQL5

Vedi anche

Tipi di Dati, Incapsulamento ed Estensibilità dei Tipi,Inizializzazione delle Variabili, Ambito Visibilità e Durata delle Variabili