Após um programa MQL5 ser carregado para execução, memória é alocada para cada variável de acordo com seu tipo. De acordo com o nível de acesso, todas as variáveis são dividas em dois tipos - variáveis globais e variáveis locais. De acordo com a classe de memória, elas pode ser parâmetros de entrada de um programa MQL5, estáticas (static) e automáticas. Se necessário, cada variável é inicializada por um valor correspondente. Após ser usada, uma variável é desinicializada e a memória usada por ela é retornada ao sistema executável MQL5.
Inicialização e Desinicialização de Variáveis Globais
Variáveis globais são inicializados automaticamente logo após um programa mql5 ser carregado e antes de qualquer função ser chamada. Durante a inicialização valores iniciais são atribuídos a variáveis de tipos simples e um construtor (se existir algum) é chamado para objetos. Variáveis de entrada são sempre declarados em um nível global, e são inicializados por valores definidos pelo usuário na janela de diálogo durante o começo do programa.
Apesar do fato de que variáveis estáticas serem geralmente declaradas em um nível local, a memória para estas variáveis é pré-alocada, e a inicialização é realizada logo após um programa ser carregado; o mesmo para variáveis globais.
A ordem de inicialização corresponde a ordem de declaração da variável no programa. A desinicialização é realizada em ordem inversa. Este regra é verdadeira apenas para as variáveis que não foram criadas pelo operador new. Tais variáveis são criadas e inicializadas automaticamente logo após carregamento, e são desinicializadas depois do descargamento do programa.
Inicialização e Desinicialização de Variáveis Locais
Se uma variável declarada em um nível local não é estática, memória é alocada automaticamente para tal variável. Variáveis locais, bem como variáveis globais, são inicializados automaticamente no momento que a execução do programa encontra a declaração de uma variável local. Assim, a ordem de inicialização corresponde à ordem de declaração.
Variáveis locais são desinicializados no final do bloco do programa, no qual elas foram declaradas, e na ordem oposta de suas declarações. Um bloco de programa é um operador de composição que pode ser uma parte de um operador de seleção switch, operador de ciclo (for, while, do-while), um corpo de função ou uma parte do operador if-else.
Variáveis locais são inicializados somente no momento em que a execução do programa encontra a declaração da variável. Se durante a execução do programa o bloco, no qual a variável está declarada, não for executada, tal variável não é inicializada.
Inicialização e Desinicialização de Objetos Colocados
Um caso especial é aquele com ponteiros de objeto, porque a declaração de um ponteiro não implica em inicialização de objetos correspondentes. Objetos colocados dinamicamente são inicializados somente no momento em que a instância da classe é criada pelo operador new. Inicialização de objetos pressupõe chamada de um construtor da classe correspondente. Se não existir construtor correspondente na classe, seus membros de tipo simples não serão automaticamente inicializados; membros de tipos string, array dinâmico e objeto complexo serão automaticamente inicializados.
Ponteiros podem ser declarados em nível local ou global; e eles podem ser inicializados pelo valor vazio de NULL ou pelo valor do ponteiro do mesmo ou herdado tipo. Se o operador new é chamado para um ponteiro declarado em um nível local, o operador delete para este ponteiro deve ser chamado antes de sair do nível. Caso contrário, o ponteiro estará perdido e a exclusão explícita do objeto falhará.
Todos os objetos criados pela expressão object_pointer=new Class_name, devem ser então excluídos pelo operador delete(object_pointer). Se por algum razão tal variável não for excluída por meio do operador delete quando o programa estiver concluído, a correspondente entrada aparecerá no diário "Experts". Pode-se declarar várias variáveis e atribuir um ponteiro de um objeto para todas elas.
Se um objeto criado dinamicamente tiver um construtor, este construtor será chamado no momento da execução do operador new. Se um objeto tiver um destrutor, ele será chamado durante a execução do operador delete.
Assim objetos colocados dinamicamente são criados somente no momento em que são criados pelo operador new, e são certamente excluídos tanto pelo operador delete ou automaticamente pelo sistema de execução do MQL5 durante a descarga do programa. A ordem de declaração de ponteiros criados dinamicamente não influenciam na ordem de suas inicializações. A ordem de inicialização e desinicialização é totalmente controlada pelo programador.
Características Transitórias de Variáveis
A principal informação sobre a ordem de criação, exclusão, sobre chamadas de construtores e destrutores é dada na tabela a baixo.