Diskussion zum Artikel "Die Reihenfolge der Erstellung und Zerstörung von Objekten in MQL5" - Seite 3

 

In der Datei localvar_testscript_4.mq5

Wenn wir nach dem Aufruf von GetPointer() den Zeigertyp ausgeben, erfahren wir, dass die Zeiger POINTER_AUTOMATIC und nicht POINTER_DINAMIC sind.

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

Daher wird diese Zeile nie ausgeführt

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

<quote.

In dieser Reihenfolge der Deklaration wird items_array zerstört, bevor das array [5] zerstört wird. In der Funktion Destroy(), die vomitems_array Destruktor aufgerufen wird, wird mit Zeigern auf noch vorhandene Objekte gearbeitet, so dass keine Fehler auftreten.

Hallo zusammen!

An dieser Stelle verstehe ich die Logik überhaupt nicht. =)

Immerhin vergleichen wir in der Destroy-Methode den Typ unseres Zeigers mit einem dynamischen Typ. Und unser Typ ist automatisch. Daher wird der Löschoperator nicht verwendet.

Aber das ist auch nicht nötig, denn automatisch erstellte Objekte werden automatisch gelöscht.

Und schließlich hat die Datei vergessen, den Typ des Rückgabewerts void für die Methoden Destroy und SetArray in der Phase der Implementierung von Methoden außerhalb der Klasse anzugeben, weshalb sie einen Fehler ausgibt.

Neulinge (wie ich) mögen sich erschrecken =)


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