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 敤敬整渠湯搠湹浡捩漠橢捥tLa reazione del terminale alla cancellazione dei puntatori non validi è stata modificata dalla pubblicazione dell'articolo? XP, 32
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, 32mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.
Perché questa riga causa l'esecuzione del costruttore?
CItem* array1[5];e questa no:
CObjectC *pObjectC;?
- www.mql5.com
Perché questa riga causa la chiamata al costruttore:
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.
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?
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?
- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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