Deletando variáveis globais

 

Olá,


Tentei deletar as memórias alocadas para os inputs de meu indicador, porém tive como retorno valor 0 (falso). Mémorias inputs não são liberáveis?


input int periodo_input = 21;

int OnInit()
{
	GlobalVariableDel("periodo_input"); // retorna 0
	return (INIT_SUCCEEDED);
}


Grato!

 
AnarcoPhysic:

Olá,


Tentei deletar as memórias alocadas para os inputs de meu indicador, porém tive como retorno valor 0 (falso). Mémorias inputs não são liberáveis?



Grato!

Olá @AnarcoPhysic.

Acredito que o comando GlobalVariableDel seja aplicável somente às variáveis globais do terminal, não sendo aplicável a variáveis do tipo input.

Para confirmar isso, sugiro mandar imprimir o valor da variável _lastError logo após executar o comando  GlobalVariableDel . Se o valor exibido for 4501 (ERR_GLOBALVARIABLE_NOT_FOUND), isso significará que meu palpite está certo.

 
Trader_Patinhas:

Olá @AnarcoPhysic.

Acredito que o comando GlobalVariableDel seja aplicável somente às variáveis globais do terminal, não sendo aplicável a variáveis do tipo input.

Para confirmar isso, sugiro mandar imprimir o valor da variável _lastError logo após executar o comando  GlobalVariableDel . Se o valor exibido for 4501 (ERR_GLOBALVARIABLE_NOT_FOUND), isso significará que meu palpite está certo.

Excelente ideia... E após você ter lido o que escreveu,  juntando com o que tinha lido,  certamente você está correto. Tinha esperança de que eram variáveis de escopo global do scripit. 

 Então... Não dá para deletar as memórias no stack,  certo? E também... Náo faz tanta difetença,  faz? Resumindo... É perder tempo,  né?

 
AnarcoPhysic
Tinha esperança de que eram variáveis de escopo global do scripit. 

São coisas completamente diferentes. As variáveis globais do terminal são aquelas que você lê e altera por meio dos comandos GlobalVariableGet  e GlobalVariableSet). Elas são comuns a todos os EA's e scripts que estiverem rodando no terminal. 

AnarcoPhysic:
Não dá para deletar as memórias no stack,  certo?

Certo.

Os dados armazenados na memória principal geralmente podem residir em 3 lugares distintos: segmento de dados (variáveis de escopo global), stack (variáveis de escopo local e parâmetros de passagem) e heap (arrays com alocação dinâmica, objetos instanciados e outros bichos dessa fauna).

O segmento de dados e o stack geralmente são pré-alocados em tamanho pré-determinado no momento em que o sistema operacional instancia o processo, de modo que não há como liberar, em tempo de execução, a memória ocupada por variáveis que habitam esses locais.

Só faz sentido "deletar" (no sentido de liberar memória ocupada) as variáveis que residam no heap, que é a única parte da memória consumida que você consegue aumentar ou reduzir ao longo da execução do programa.  

Não conheço a arquitetura interna do MT5, mas acredito que as variáveis do tipo input sejam alocadas no stack, que é onde normalmente são alocados os parâmetros de passagem (afinal nada mais são que parâmetros de passagem entre o terminal e o robô), e que as variáveis globais do terminal sejam alocadas no heap (senão não faria sentido existir um comando como GlobalVariableDel ).  

AnarcoPhysic:
Náo faz tanta difetença,  faz? Resumindo... É perder tempo,  né?

Não faz mesmo. Caso fosse possível "deletá-las", a economia de memória seria insignificante.

Razão: