Discussion de l'article "L'ordre de création et de destruction d'objets dans MQL5"

 

Un nouvel article L'ordre de création et de destruction d'objets dans MQL5 a été publié :

Chaque objet, qu'il s'agisse d'un objet personnalisé, d'un tableau dynamique ou d'un tableau d'objets, est créé et supprimé dans le programme MQL5 à sa manière. Souvent, certains objets font partie d'autres objets et l'ordre de suppression des objets lors de la désinitialisation devient particulièrement important. Cet article fournit quelques exemples qui couvrent les mécanismes de travail avec des objets.

Les programmes MQL5 sont écrits dans des concepts de programmation orientée objet (POO), et cela ouvre non seulement de nouvelles possibilités pour créer des bibliothèques personnalisées, mais vous permet également d'utiliser des classes complètes et testées d'autres développeurs. Dans la bibliothèque standard, qui est incluse dans le terminal client MetaTrader 5, il existe des centaines de classes qui contiennent des milliers de méthodes.

Pour tirer pleinement parti de la POO, nous devons clarifier certains détails sur la création et la suppression d'objets dans les programmes MQL5. La création et la suppression d'objets sont brièvement décrites dans Documentation, et cet article illustrera ce sujet dans des exemples.

Auteur : MetaQuotes

 

Lorsque LocalVar_TestScript_2.mq5 est exécuté pour la première fois, il donne seulement

PO      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
LD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
HJ      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
DS      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
PH      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
GP      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
KF      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
OM      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
CD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
GK      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor

c'est-à-dire sans le message"delete invalid pointer". Après avoir recompilé le même fichier (c'est-à-dire après la deuxième compilation), il affiche ceci :

PQ      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
LH      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
HO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
DF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
PL      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
GR      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
KK      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
OP      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
CF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
GO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
PH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
RP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
DH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
FP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
HH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
La réaction du terminal à la suppression des pointeurs invalides a-t-elle été modifiée depuis la publication de l'article ? XP, 32
 
Yedelkin:

Lorsque LocalVar_TestScript_2.mq5 est exécuté pour la première fois, il donne seulement

c'est-à-dire sans le message"delete invalid pointer". Après avoir recompilé le même fichier (c'est-à-dire après la deuxième compilation), il affiche ceci :

La réaction du terminal à la suppression des pointeurs invalides a-t-elle été modifiée depuis la publication de l'article ? XP, 32
Merci pour le message. Corrigé. Le comportement a changé, maintenant le message"delete invalid pointer" n'est généré que lors de la compilation pour le débogage.
 

mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.

D'accord, nous aimerions voir une clarification de l'article.
 

Pourquoi cette ligne provoque-t-elle l'exécution du constructeur ?

 CItem* array1[5];

et celle-ci non :

CObjectC *pObjectC;
?
 
Le nouvel opérateur n'est nécessaire que pour rendre la classe dynamique ? Mais si un tableau dynamique est "un tableau dont la première paire de crochets contient une valeur non spécifiée", qu'est-ce qu'une classe dynamique ?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Pourquoi cette ligne provoque-t-elle l'appel du constructeur ?

J'ai vérifié, aucun appel au constructeur n'est fait, veuillez joindre le code complet s'il vous plaît.
 
Burgunsky:

Et pourquoi cette ligne provoque l'exécution du constructeur : CItem* array1[5] ;,

mais pas celle-ci : CObjectC *pObjectC ; ?

J'ai compris que la ligne

CItem* array1[5];

n'entraîne pas à elle seule le lancement du constructeur. Voici un code plus complet tiré de l'article :

void OnStart()
  {
//--- déclarer le premier tableau de pointeurs sur l'objet
   CItem* array1[5];
//--- déclarer le second tableau de pointeurs sur l'objet
   CItem* array2[5];
//--- remplissons maintenant les tableaux dans la boucle
   for(int i=0;i<5;i++)
     {
      //--- le pointeur du premier tableau sera créé par l'opérateur new
      array1[i]=new CItem;
      //--- le pointeur du deuxième tableau sera copié à partir du premier tableau
      array2[i]=array1[i];
     }
Le constructeur est appelé non pas lors de la déclaration du premier tableau de pointeurs, mais lors du remplissage de ce tableau dans une boucle à l'aide de l'opérateur new.
 
Burgunsky:
Le nouvel opérateur n'est nécessaire que pour rendre la classe dynamique ? Mais si un tableau dynamique est "un tableau dont la première paire de crochets contient une valeur non spécifiée", qu'est-ce qu'une classe dynamique ?
J'ai compris que le mot "dynamique" en programmation est polysémique. En ce qui concerne les classes, il y a une opposition : "objet créé automatiquement" vs "objet créé dynamiquement". La différence entre les deux est à peu près la même qu'entre les variables déclarées au niveau global et les variables déclarées au niveau local. En d'autres termes, un "objet créé dynamiquement" est un objet créé "pour un temps", sa durée de vie s'étend du moment de sa création par l'opérateur new au moment de sa suppression par l'opérateur delete.
 

Mais des questions subsistent :

Quel est l'intérêt de créer un objet dynamique via l'opérateur new ?

Lors de la création automatique d'un objet, l'objet de classe est créé dans la pile, ce qui est plus rapide que l'objet dynamique en termes de temps d'exécution.

Lors de la création dynamique d'un objet, l'objet de classe est créé en mémoire (dans le tas) en utilisant le gestionnaire de mémoire du système d'exploitation, le processus est plus lent.

Voici une question : si la création automatique est plus rapide, pourquoi les objets dynamiques sont-ils créés ? Pour éviter que la pile ne déborde ?

 
Les fichiers de code source joints et les inserts de code source dans le code HTML sont désormais entièrement traduits en portugais.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.