Créer et Supprimer des Objets

Une fois qu'un programme MQL5 est chargé pour être exécuté, la mémoire est allouée pour chaque variable selon son type. Selon le niveau d'accès, toutes les variables sont divisées en deux types - variables globales et variables locales. Selon la classe de la mémoire, elles peuvent être les paramètres d'entrée d'un programme MQL5, statiques et automatiques. Si nécessaire, chaque variable est initialisée par une valeur correspondante. Après avoir été utilisée, une variable est désinitialisée et la mémoire qui était utilisée est rendue au système exécutable MQL5.

Initialisation et Désinitialisation des Variables Globales

Les variables globales sont initialisées automatiquement juste après le chargement d'un programme MQL5 et avant que n'importe quelle fonction ne soit appelée. Pendant l'initialisation, les valeurs initiales sont affectées aux variables de type simple et un constructeur (s'il existe) est appelé pour les objets. Les variables d'entrée sont toujours déclarées au niveau global, et sont initialisées avec les valeurs définies par l'utilisateur dans la boîte de dialogue au lancement du programme.

Bien que les variables statiques sont habituellement déclarées au niveau local, la mémoire pour ces variables est pré-allouée, et l'initialisation est effectuée directement après le chargement du programme, de la même façon que pour les variables globales.

L'ordre d'initialisation correspond à l'ordre de déclaration des variables dans le programme. La désinitialisation est effectuée dans l'ordre inverse. Cette règle n'est vraie que pour les variables qui n'ont pas été créées avec l'opérateur new. Ces variables sont créées et initialisées automatiquement juste après le chargement et sont désinitialisées avant le déchargement du programme.

Initialisation et Désinitialisation des Variables Locales

Si une variable déclarée au niveau local est n'est pas statique, la mémoire est allouée automatiquement pour cette variable. Les variables locales, telles que les variables globales, sont initialisées automatiquement au moment où l'exécution du programme rencontre leur déclaration. L'ordre d'initialisation correspond donc à l'ordre de déclaration.

Les variables locales sont désinitialisées à la fin du bloc du programme dans lequel elles ont été déclarées et dans l'ordre inverse à leur déclaration. Un bloc de programme est un opérateur composé qui peut être une partie d'un opérateur de sélection switch, d'un opérateur de boucle (for, while, do-while), d'un corps de fonction ou d'une partie d'un opérateur if-else.

Les variables ne sont initialisées qu'au moment où l'exécution du programme rencontre la déclaration de la variable. Si pendant l'exécution du programme le bloc dans lequel la variable est déclarée n'est pass exécuté, cette variable n'est pas initialisée.

Initialisation et Désinitialisation des Objets Placés

Les pointeurs d'objet sont un cas spécial, car la déclaration d'un pointeur n'implique pas l'initialisation de l'objet correspondant. Les objets placés dynamiquement ne sont initialisés qu'au moment où l'objet est créé avec l'opérateur new. L'Initialisation des objets présuppose l'appel à un constructeur de la classe correspondante. S'il n'y a pas de constructeur correspondant dans la classe, ses membres de type simple ne seront pas initialisés automatiquement ; ses membres de type string, tableau dynamique et objet complexe seront initialisés automatiquement.

Les pointeurs peuvent être déclarés au niveau local ou global ; et ils peuvent être initialisés avec la valeur vide de NULL oou avec la valeur du pointeur du même type ou du type hérité. Si l'opérateur new est appelé pour un pointeur déclaré au niveau local, l'opérateur delete pour ce pointeur doit être appelé avant de sortir du niveau. Autrement, le pointeur sera perdu et la suppression explicite de l'objet échouera.

Tous les objets créés par une expression pointeur_objet=new Nom_de_classe, doivent être supprimés par un opérateur delete(pointeur_objet). Si une telle variable n'est pas supprimée pour n'importe quelle raison par l'opérateur delete lorsque le programme est terminé, l'entrée correspondate apparaîtra dans le journal de l'onglet "Experts". Il est possible de déclarer plusieurs variables et de leur assigner à toutes le pointeur d'un même objet.

Si un objet créé dynamiquement a un constructeur, celui-ci sera appelé au moment de l'exécution de l'opérateur new . Si un objet a un destructeur, celui-ci sera appelé au moment de l'exécution de l'opérateur delete.

Les objets placés dynamiquement ne sont donc créés qu'au moment de l'invocation de leur opérateur new , et sont assurés d'être supprimés soit par l'opérateur delete ou automatiquement par le système d'exécution de MQL5 lors du déchargement du programme. L'ordre de déclaration des pointeurs des objets créés dynamiquement n'influence pas l'ordre de leur initialisation. L'ordre d'initialisation et de désinitialisation est totalement contrôlé par le programmeur.

Allocation dynamique de la mémoire en MQL5

Lors de l'utilisation de tableaux dynamiques, la mémoire libérée est automatiquement rendue au système d'exploitation.

Lors de l'utilisation d'objets de classe dynamiques avec l'opérateur new, la mémoire est d'abord demandée dans la zone de mémoire de la classe avec laquelle le gestionnaire de mémoire fonctionne. S'il n'y a plus assez de mémoire, la mémoire est demandée au système d'exploitation. Lors de la suppression de l'objet dynamique avec l'opérateur delete, la mémoire libérée est immédiatement rendue à la zone de mémoire de la classe.

Le gestionnaire de mémoire libère la mémoire et la rend au système d'exploitation après la fin des fonctions de gestion des évènements : OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().

Principales Caractéristiques des Variables

Les principales informations sur l'ordre de création suppression sur les appels des constructeurs et destructeurs sont données dans le tableau ci-dessous.


Variable automatique globale

Variable automatique locale

Object créé dynamiquement

Initialisation

directement après qu'un programme mql5 soit chargé

lorsque la ligne de code où elle est déclarée est atteinte pendant l'exécution

à l'exécution de l'opérateur new

Ordre d'initialisation

dans l'ordre de déclaration

dans l'ordre de déclaration

indépendant de l'ordre de déclaration

Désinitialisation

avant qu'un programme mql5 soit déchargé

lorsque l'exécution sort du bloc de déclaration

lorsque l'opérateur delete est exécuté ou avant qu'un programme mql5 soit déchargé

Ordre de désinitialisation

dans l'ordre inverse à l'ordre d'initialisation

dans l'ordre inverse à l'ordre d'initialisation

indépendant de l'ordre d'initialisation

Appel du constructeur

au chargement du programme mql5

à l'initialisation

à l'exécution de l'opérateur new

Appel du destructeur

au déchargement du programme mql5

lors de la sortie du bloc où la variable a été initialisée

à l'exécution de l'opérateur delete

Journaux des erreurs

écrit un message dans le journal de l'onglet "Experts" sur la tentative de suppression d'un objet créé automatiquement

écrit un message dans le journal de l'onglet "Experts" sur la tentative de suppression d'un objet créé automatiquement

écrit un message dans le journal de l'onglet "Experts" sur la non-suppression d'objets créés dynamiquement au moment du déchargement du programme mql5

Voir aussi

Types de Données, Encapsulation et Extension des Types,Initialisation des Variables, Portée de Visibilité et Cycle de Vie des Variables