Discusión sobre el artículo "La Orden de Creación y Destrucción de Objetos en MQL5"

 

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.

 

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
 
Yedelkin:

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, 32
Gracias por el mensaje. Corregido. El comportamiento ha cambiado, ahora el mensaje"borrar puntero inválido" se genera sólo al compilar para depuración.
 

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

OK, nos gustaría ver una aclaración del artículo.
 

¿Por qué esta línea hace que se ejecute el constructor?

 CItem* array1[5];

y esta otra no:

CObjectC *pObjectC;
?
 
¿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?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Por qué esta línea hace que se llame al constructor:

Lo he comprobado, no se hace ninguna llamada al constructor, por favor adjunte el código completo por favor
 
Burgunsky:

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.
 
Burgunsky:
¿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?
Tenía entendido que la palabra "dinámico" en programación es polisémica. Cuando se trata de clases, existe una oposición: "objeto creado automáticamente" frente a "objeto creado dinámicamente". La diferencia entre ellos es aproximadamente la misma que entre las variables declaradas a nivel global y las variables declaradas a nivel local. En otras palabras, un "objeto creado dinámicamente" es un objeto creado "por un tiempo", su tiempo de vida es desde el momento de creación por el operador new hasta el momento de borrado por el operador delete.
 

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?

 
Los archivos de código fuente adjuntos y los insertos de código fuente en código HTML están ahora completamente traducidos al portugués para su comodidad.
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.