Discussione sull’articolo "L'Ordine di Creazione e Distruzione dell'oggetto in MQL5" - pagina 3

 

Nel file localvar_testscript_4.mq5

Se dopo la chiamata a GetPointer() si stampa il tipo di puntatore, si scopre che i puntatori sono POINTER_AUTOMATIC e non POINTER_DINAMIC.

m_array[i]=GetPointer(array[i]);
Print(EnumToString(CheckPointer(m_array[i])));  //POINTER_AUTOMATICO non POINTER_DINAMICO

Pertanto questa riga non viene mai eseguita

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

<quote.

In questo ordine di dichiarazione,items_array viene distrutto prima che venga distrutto l'array di oggetti array [5]. Nella funzione Destroy(), che viene richiamata dal distruttore diitems_array, il lavoro viene fatto con i puntatori agli oggetti ancora esistenti, quindi non si verificano errori.

Ciao a tutti!

Qui è dove non capisco affatto la logica. =)

Dopo tutto, nel metodo Destroy confrontiamo il tipo del nostro puntatore con un tipo dinamico. E il nostro tipo è automatico. Pertanto, l'operatore delete non viene utilizzato.

Ma non è necessario, perché gli oggetti creati automaticamente vengono cancellati automaticamente.

Infine, il file ha dimenticato di specificare il tipo di valore di ritorno void per i metodi Destroy e SetArray nella fase di implementazione dei metodi esterni alla classe, per cui viene lanciato un errore.

I neofiti (come me) potrebbero spaventarsi =)


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");
     }
  }