Creación y eliminación de objetos

Una vez cargado el programa mql5 para ser ejecutado, a cada constante se le asigna una parte de memoria de acuerdo con el tipo de la variable. Dependiendo del nivel de acceso las variables se dividen en dos tipos: variables globales y variables locales, y también dependiendo de las clases de memoria: parámetros input del programa mql5, estáticas y automáticas. En caso de necesidad cada variable es inicializada por el valor correspondiente. Después de ser usada, la variable se deinicializa, y la memoria ocupada por ésta se devuelve al sistema ejecutivo MQL5.

Inicialización y deinicialización de variables globales

Las variables globales se inicializan de una forma automática inmediatamente después de que se cargue el programa mql5 y antes de que se llame a cualquier función. Durante la inicialización se asignan valores iniciales a las variables de tipos simples y se llama al constructor (si existe) para los objetos. Los parámetros input siempre se declaran a nivel global, son inicializados por valores asignados por los usuarios en un diálogo durante el inicio del programa mql5.

A pesar de que las variables estáticas suelen declararse a nivel local, la memoria para estas variables se distribuye de antemano, y la inicialización se realiza justo después de que el programa se cargue, lo mismo que pasa con las variables globales.

El orden de inicialización corresponde al orden de declaración de una variable en el programa, y la deinicialización se realiza a la inversa antes de cargar el programa. Esta regla vale sólo para la variables que no han sido creadas por el operador new. Estas variables se crean y se inicializan automáticamente justo después de la carga, y se deinicializan directamente antes de la descarga del programa.

Inicialización y deinicialización de variables locales

Si una variable declarada a nivel local no es estática, entonces la distribución de memoria para esta variable se realiza de una forma automática. Las variables locales, igual como globales, se inicializan automáticamente en el momento cuando la ejecución del programa encuentra la declaración de una variable local. De esta manera, el orden de inicialización corresponde al orden de declaración.

Las variables locales se deinicializan al final del bloque del programa en el cual ha sido declaradas, y en el orden inverso a la declaración. Un bloque del programa es un operador compuesto que puede ser una parte del operador de elección switch, ciclo (for, while, do-while), cuerpo de función o parte del operador if-else.

Las variables locales se inicializan sólo en el momento cuando la ejecución del programa llega a la declaración de variable. Si durante el proceso de ejecución del programa el bloque en el que una variable está declarada, no ha sido ejecutado, esta variable no se inicializa.

Inicialización y deinicialización de objetos colocados dinámicamente

Un caso especial representan los punteros a objetos, puesto que la declaración de un puntero no implica la posterior inicialización del objeto correspondiente. Los objetos colocados dinámicamente se inicializan sólo en el momento cuando la muestra de clase es creada por el operador new. La inicialización del objeto supone la invocación del constructor de la clase correspondiente. Si en la clase no hay constructores correspondientes, entonces sus elementos que tienen el tipo simple, no serán inicializados automáticamente; los elementos de tipos string, array dinámico y objeto compuesto serán inicializados de una forma automática.

Los punteros pueden ser declarados a nivel local o global y pueden ser inicializados por el valor vacío NULL o por el valor del puntero del mismo tipo o del tipo derivado. Si el operador new ha sido invocado para un puntero declarado a nivel local, entonces el operador delete para este puntero tiene que ser ejecutado antes de salir de este nivel. En caso contrario, el puntero se perderá y el objeto no podrá ser eliminado de una forma explícita.

Todos los objetos creados por la expresión puntero_objeto=new Nombre_Clase, a continuación tienen que ser eliminados obligatoriamente por el operador delete(puntero_objeto). Si por alguna razón esta variable no ha sido eliminada por el operador delete después de que el programa complete su trabajo, aparecerá un mensaje de entrada en el apartado "Expertos". Es posible declarar varias variables, y asignarles a todas el puntero a un objeto.

Si el objeto creado dinámicamente tiene un constructor, este constructor será llamado en el momento de la ejecución del operador new. Si el objeto tiene un destructor, este destructor será llamado en el momento de la ejecución del operador delete.

De esta manera, los objetos colocados dinámicamente se crean sólo en el momento cuando son creados por el operador new, y se eliminan de una forma garantizada por el operador delete o automáticamente por el sistema ejecutora de MQL5 durante la descarga del programa. El orden de declaración de punteros de los objetos creados dinámicamente no influye en el orden de su inicialización. El programador controla completamente el orden de inicialización y deinicialización.

Particularidades de trabajo con la memoria dinámica

Durante el trabajo con los arrays dinámicos la memoria liberada se devuelve inmediatamente al sistema operativo.

Cuando se crea un objeto dinámico de la clase a través del operador new, primero la memoria se solicita desde el pool de la memoria de las clases con el que trabaja el asistente de memoria. Si en el pool no hay memoria suficiente, entonces ésta se solicita en el sistema operativo. Cuando un objeto dinámico se elimina a través del operador delete, la memoria que ocupaba este objeto se devuelve al pool de la memoria de las clases.

El asistente de la memoria devuelve la memoria al sistema inmediatamente después de la salida de las funciones-manejadores de eventos: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().

Características breves de variables

La información general sobre el orden de creación, eliminación, llamada a los constructores y destructores se muestra en la tabla de abajo.


Variable global automática

Variable local automática

Objeto creado dinámicamente

Inicialización

inmediatamente después de que se cargue el programa mql5

al llegar durante la ejecución a la línea de código, donde ésta está declarada

durante la ejecución del operador new

Orden de inicialización

en el orden de declaración

en el orden de declaración

no depende del orden de declaración

Deinicialización

antes de que se descargue el programa mql5

cuando la ejecución abandona el bloque de declaración

durante la ejecución del operador delete o antes de que se descargue el programa mql5

Orden de deinicialización

en el orden inverso a la inicialización

en el orden inverso a la inicialización

no depende del orden de inicialización

Llamada al constructor

al cargar el programa mql5

durante la inicialización

durante la ejecución del operador new

Llamada al destructor

al descargar el programa mql5

al salir del bloque donde la variable ha sido inicializada

durante la ejecución del operador delete

Aviso de errores

aviso en el apartado "Expertos" sobre el intento de eliminación del objeto creado automáticamente

aviso en el apartado "Expertos" sobre el intento de eliminación del objeto creado automáticamente

aviso en el apartado "Expertos" sobre los objetos creados dinámicamente pero con fallos durante la descarga del programa mql5

Véase también

Tipos de datos, Encapsulación y extensión de tipos, Inicialización de variables, Visibilidad y tiempo de vida de variables