Cuando LocalVar_TestScript_2.mq5 se ejecuta por primera vez, sólo da como resultado
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
es decir, sin el mensaje"delete invalid pointer". Después de recompilar el mismo archivo (es decir, después de la segunda compilación), muestra esto:
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¿Ha cambiado la reacción del terminal al borrar punteros inválidos desde que se publicó el artículo? XP, 32
Cuando LocalVar_TestScript_2.mq5 se ejecuta por primera vez, sólo da como resultado
es decir, sin el mensaje"delete invalid pointer". Después de recompilar el mismo archivo (es decir, después de la segunda compilación), muestra esto:
¿Ha cambiado la reacción del terminal al borrar punteros inválidos desde que se publicó el artículo? XP, 32mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.
¿Por qué esta línea hace que se ejecute el constructor?
CItem* array1[5];
y esta otra no:
CObjectC *pObjectC;?

- www.mql5.com
Por qué esta línea hace que se llame al constructor:
Y por qué esta línea hace que se ejecute el constructor: CItem* array1[5];,
pero ésta no: CObjectC *pObjectC; ?
Tenía entendido que la línea
CItem* array1[5];
por sí misma no hace que se lance el constructor. Aquí está el código más completo del artículo:
void OnStart() { //--- declara el primer array de punteros al objeto CItem* array1[5]; //--- declara el segundo array de punteros al objeto CItem* array2[5]; //--- ahora vamos a llenar las matrices en el bucle for(int i=0;i<5;i++) { //--- el puntero para el primer array será creado por el operador new array1[i]=new CItem; //--- el puntero de la segunda matriz se copiará de la primera matriz array2[i]=array1[i]; }El constructor es llamado no cuando se declara el primer array de punteros, sino cuando se rellena este array en un bucle usando el operador new.
¿El operador new sólo es necesario para que la clase sea dinámica? Pero si un array dinámico es "un array con un valor no especificado en el primer par de corchetes", ¿qué es una clase dinámica?
Pero aún quedan preguntas:
¿Qué sentido tiene crear un objeto dinámico mediante el operador new?
Cuando se crea un objeto automáticamente, el objeto de clase se crea en la pila, es más rápido que el objeto dinámico por tiempo de ejecución.
Cuando se crea un objeto dinámicamente, el objeto de clase se crea en memoria (en el montón) mientras se utiliza el gestor de memoria del SO, el proceso es más lento.
He aquí una pregunta: si la creación automática es más rápida, ¿por qué se crean objetos dinámicos? ¿Para evitar que la pila se desborde?

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

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado La Orden de Creación y Destrucción de Objetos en MQL5:
Cada objeto, ya sea un objeto personalizado, un array dinámico o un array de objetos, se crea y elimina en el programa MQL5 de una forma particular. A menudo, algunos objetos son parte de otros objetos, y el orden de eliminación de objetos durante la desinicialización se vuelve especialmente importante. Este artículo facilita algunos ejemplos que muestran los mecanismos para trabajar con objetos.
Los programas MQL5 se escriben en conceptos de Object Oriented Programming (OOP, Programación Orientada al Objeto), y esto no solo abre nuevas posibilidades para la creación de bibliotecas personalizadas, sino que también le permitirá usar clases completas y probadas de otros desarrolladores. En la Biblioteca estándar incluida en el Terminal de Cliente MetaTrader 5 hay cientos de clases que contienen miles de métodos.
Para aprovechar al máximo el OOP, debemos aclarar algunos detalles sobre la creación y destrucción de objetos en programas MQL5. La Creación y Destrucción de Objetos se describe brevemente en la Documentación, y este artículo ilustrará este tópico con ejemplos.Autor: MetaQuotes Software Corp.