Discussão do artigo "A Ordem de Destruição e Criação do Objeto em MQL5" - página 3

 

No arquivo localvar_testscript_4.mq5

Se, após a chamada a GetPointer(), imprimirmos o tipo de ponteiro, ele nos informará que os ponteiros são POINTER_AUTOMATIC e não POINTER_DINAMIC.

m_array[i]=GetPointer(array[i]);
Print(EnumToString(CheckPointer(m_array[i])));  //POINTER_AUTOMATIC não POINTER_DINAMIC

Portanto, essa linha nunca é executada

if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
 

<quote.

Nessa ordem de declaração,items_array é destruído antes que a matriz [5] seja destruída. Na função Destroy(), que é chamada a partir do destruidor deitems_array, o trabalho é feito com ponteiros para objetos ainda existentes, portanto, não ocorrem erros.

Olá a todos!

É aqui que eu não entendo nada da lógica. =)

Afinal de contas, no método Destroy, comparamos o tipo do nosso ponteiro com um tipo dinâmico. E nosso tipo é automático. Portanto, o operador delete não é usado.

Mas isso não é necessário, pois os objetos criados automaticamente são excluídos automaticamente.

E, por fim, o arquivo se esqueceu de especificar o tipo de valor de retorno void para os métodos Destroy e SetArray no estágio de implementação de métodos fora da classe, o que gera um erro.

Os novatos (como eu) podem se assustar =)


void CItemArray::Destroy(void)
  {
   for(int i=0;i<ArraySize(m_array);i++)
     {
      if(CheckPointer(m_array[i])!=POINTER_INVALID)
        {
         if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
        }
      else Print("Invalid pointer to delete");
     }
  }