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 敤敬整渠湯搠湹浡捩漠橢捥tLa réaction du terminal à la suppression des pointeurs invalides a-t-elle été modifiée depuis la publication de l'article ? XP, 32
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, 32mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.
Pourquoi cette ligne provoque-t-elle l'exécution du constructeur ?
CItem* array1[5];
et celle-ci non :
CObjectC *pObjectC;?

- www.mql5.com
Pourquoi cette ligne provoque-t-elle l'appel du constructeur ?
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.
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 ?
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 ?

- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com

- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
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