Discussione sull’articolo "L'Ordine di Creazione e Distruzione dell'oggetto in MQL5"

 

Il nuovo articolo L'Ordine di Creazione e Distruzione dell'oggetto in MQL5 è stato pubblicato:

Ogni oggetto, sia esso un oggetto personalizzato, un array dinamico o un array di oggetti, viene creato ed eliminato nel programma MQL5 nel suo modo particolare. Spesso, alcuni oggetti fanno parte di altri oggetti e l'ordine di eliminazione dell'oggetto durante la reinizializzazione diventa particolarmente importante. Questo articolo fornisce alcuni esempi che illustrano i meccanismi di utilizzo degli oggetti.

I programmi MQL5 sono scritti in concetti di Object Oriented Programming (OOP) e questo non solo apre nuove possibilità per la creazione di librerie personalizzate, ma consente anche di utilizzare classi complete e testate di altri sviluppatori. Nella Libreria Standard inclusa nel Client Terminal MetaTrader 5, ci sono centinaia di classi che contengono migliaia di metodi.

Per sfruttare appieno i vantaggi dell'OOP dobbiamo chiarire alcuni dettagli sulla creazione e l'eliminazione di oggetti nei programmi MQL5. La Creazione e l'Eliminazione di Oggetti è descritta brevemente nella Documentazione e questo articolo illustrerà questo argomento attraverso degli esempi.

Autore: MetaQuotes

 

Quando LocalVar_TestScript_2.mq5 viene eseguito per la prima volta, dà soltanto

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

cioè senza il messaggio"eliminare puntatore non valido". Dopo aver ricompilato lo stesso file (cioè dopo la seconda compilazione), viene visualizzato questo messaggio:

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 reazione del terminale alla cancellazione dei puntatori non validi è stata modificata dalla pubblicazione dell'articolo? XP, 32
 
Yedelkin:

Quando LocalVar_TestScript_2.mq5 viene eseguito per la prima volta, dà soltanto

cioè senza il messaggio"eliminare puntatore non valido". Dopo aver ricompilato lo stesso file (cioè dopo la seconda compilazione), viene visualizzato questo messaggio:

La reazione del terminale alla cancellazione dei puntatori non validi è stata modificata dalla pubblicazione dell'articolo? XP, 32
Grazie per il messaggio. Corretto. Il comportamento è cambiato, ora il messaggio"delete invalid pointer" viene generato solo quando si compila per il debug.
 

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

OK, vorremmo vedere un chiarimento dell'articolo.
 

Perché questa riga causa l'esecuzione del costruttore?

 CItem* array1[5];

e questa no:

CObjectC *pObjectC;
?
 
L'operatore new è necessario solo per rendere la classe dinamica? Ma se un array dinamico è "un array con un valore non specificato nella prima coppia di parentesi quadre", cos'è una classe dinamica?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Perché questa riga causa la chiamata al costruttore:

Ho controllato, non viene chiamato alcun costruttore, si prega di allegare l'intero codice.
 
Burgunsky:

E perché questa riga causa l'esecuzione del costruttore: CItem* array1[5];,

ma questa no: CObjectC *pObjectC; ?

Ho capito che la riga

CItem* array1[5];

da sola non provoca l'avvio del costruttore. Ecco un codice più completo tratto dall'articolo:

void OnStart()
  {
//--- dichiarare il primo array di puntatori all'oggetto
   CItem* array1[5];
//--- dichiarare il secondo array di puntatori all'oggetto
   CItem* array2[5];
//--- ora riempiamo gli array nel ciclo
   for(int i=0;i<5;i++)
     {
      //--- il puntatore per il primo array sarà creato dall'operatore new
      array1[i]=new CItem;
      //--- il puntatore per il secondo array sarà copiato dal primo array
      array2[i]=array1[i];
     }
Il costruttore viene chiamato non quando si dichiara il primo array di puntatori, ma quando si riempie questo array in un ciclo utilizzando l'operatore new.
 
Burgunsky:
L'operatore new è necessario solo per rendere la classe dinamica? Ma se un array dinamico è "un array con un valore non specificato nella prima coppia di parentesi quadre", cos'è una classe dinamica?
Ho capito che la parola "dinamico" nella programmazione è polisemica. Quando si parla di classi, c'è un'opposizione: "oggetto creato automaticamente" contro "oggetto creato dinamicamente". La differenza tra i due è all'incirca la stessa che c'è tra le variabili dichiarate a livello globale e quelle dichiarate a livello locale. In altre parole, un "oggetto creato dinamicamente" è un oggetto creato "per un po'", la cui vita va dal momento della creazione con l'operatore new al momento della cancellazione con l'operatore delete.
 

Ma ci sono ancora domande:

Che senso ha creare un oggetto dinamico tramite l'operatore new?

Quando si crea un oggetto automaticamente, l'oggetto di classe viene creato nello stack, ed è più veloce dell'oggetto dinamico in termini di tempo di esecuzione.

Quando si crea un oggetto dinamicamente, l'oggetto di classe viene creato in memoria (nell'heap) mentre si utilizza il gestore della memoria del sistema operativo, il processo è più lento.

Ecco una domanda: se la creazione automatica è più veloce, perché vengono creati oggetti dinamici? Per evitare che lo stack trabocchi?

[Eliminato]  
I file di codice sorgente allegati e gli inserti di codice sorgente nel codice HTML sono ora completamente tradotti in portoghese per comodità.
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.