Discussion de l'article "L'ordre de création et de destruction d'objets dans MQL5" - page 3

 

Dans le fichier localvar_testscript_4.mq5

Si après l'appel à GetPointer(), nous imprimons le type de pointeur, cela nous indique que les pointeurs sont POINTER_AUTOMATIC et non POINTER_DINAMIC.

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

Par conséquent, cette ligne n'est jamais exécutée

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

<quote.

Dans cet ordre de déclaration,items_array est détruit avant que le tableau d'objets array [5] ne le soit. Dans la fonction Destroy(), qui est appelée à partir du destructeur deitems_array, le travail est effectué avec des pointeurs sur des objets encore existants, de sorte qu'aucune erreur ne se produit.

Bonjour à tous !

C'est là que je ne comprends pas du tout la logique. =)

Après tout, dans la méthode Destroy, nous comparons le type de notre pointeur avec un type dynamique. Et notre type est automatique. Par conséquent, l'opérateur delete n'est pas utilisé.

Mais ce n'est pas nécessaire, car les objets créés automatiquement sont supprimés automatiquement.

Enfin, le fichier a oublié de spécifier le type de la valeur de retour void pour les méthodes Destroy et SetArray à l'étape de l'implémentation des méthodes en dehors de la classe, ce qui provoque une erreur.

Les néophytes (comme moi) peuvent être effrayés =)


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