Fragen zu OOP in MQL5 - Seite 4

 
Dmitry Fedoseev:
Der Zeiger kann auch als Nicht-Referenz übergeben werden - ohne &.
Ja, das können Sie. Wenn wir jedoch einen Zeiger ohne & übergeben, wird ein neuer Zeiger auf dem Stack erstellt, dem der übergebene Wert zugewiesen wird. Außerdem ändert sich der auf dem Stapel erzeugte Zeiger, wenn wir in einer Funktion Speicher mit diesem Zeiger zuweisen, was bedeutet, dass wir beim Abrollen des Stapels ein Speicherleck bekommen. Natürlich ist es nicht gut, das zu tun, aber wenn man es will...
 
Vladimir Simakov:
Wenn Destruktoren auf diese Weise aufgerufen werden, wird der auf dem Stack erzeugte Zeiger verändert, und folglich kommt es zu Speicherlecks, wenn der Stack "abgewickelt" wird. Natürlich ist es nicht gut, das zu tun, aber wenn man es will...

das Verhalten von Zeigern auf Klassen in MQL ist nicht vorhersehbar, einer der Admins schrieb einmal, dass alle Klassen im globalen Speicher erstellt werden (Speicherzuweisung), Sie schreiben, dass Zeiger auf Klassen im lokalen Bereich im Stapel erstellt werden (imho sollte es so sein!)

Obwohl ich vielleicht etwas durcheinander bringe, werde ich es vielleicht überprüfen - in der Theorie ist es nicht schwer zu überprüfen, es ist genug, um Print() im Destruktor der Testklasse zu registrieren, Destruktoren müssen automatisch aufgerufen werden, wenn sie den lokalen Bereich verlassen...

 
Vladimir Simakov:
Ja, das können sie. Nur wenn wir einen Zeiger ohne & übergeben, wird ein neuer Zeiger auf dem Stack erzeugt, dem der übergebene Wert zugewiesen wird. Und wenn wir mit diesem Zeiger in einer Funktion Speicher zuweisen, ändert sich der auf dem Stapel erstellte Zeiger, so dass wir beim Abrollen des Stapels ein Speicherleck bekommen. Natürlich ist es nicht gut, das zu tun, aber wenn man es will...

Es wird keine Leckagen geben. Denn niemand ordnet diesem Zeiger in der Funktion etwas zu.

 
Igor Makanu:

das Verhalten von Zeigern auf Klassen in MQL ist nicht vorhersehbar, einer der Admins schrieb einmal, dass alle Klassen im globalen Speicher erstellt werden (Speicherzuweisung), Sie schreiben, dass Zeiger auf Klassen im lokalen Bereich im Stapel erstellt werden (imho sollte es so sein!)

Obwohl ich durch etwas verwirrt sein kann, vielleicht werde ich es überprüfen - in der Theorie ist es nicht schwer zu überprüfen, es ist genug, um Print() im Destruktor der Testklasse zu registrieren, Destruktoren müssen automatisch aufgerufen werden, wenn Sie lokalen Bereich verlassen...

Wenn Speicher dynamisch zugewiesen wird (new), wird er auf dem Heap zugewiesen, und wenn Sie ein Objekt auf dem Stack erstellen (CObj obj;), wird ihm ebenfalls Speicher auf dem Stack zugewiesen.

 
Dmitry Fedoseev:

Es wird keine Leckagen geben. Denn niemand ordnet diesem Zeiger in der Funktion etwas zu.

void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Dies ist ein klassisches Leck. Der auf dem Stack erstellte Zeiger, der bei der Erstellung mit dem an die Funktion übergebenen Wert initialisiert wurde, erhielt einen neuen Wert und wurde zum Zeiger auf ein neues Objekt. Danach wurde der Zeiger beim Ausklappen des Stapels sicher gelöscht. Das ist genau das, was wir beweisen mussten. Das ist genau der richtige Ort dafür:

void CreateLabel(CChartObjectLabel* &l,string name,int y)
 
Vladimir Simakov:

Wenn Speicher dynamisch zugewiesen wird (new), wird er auf dem Heap zugewiesen, und wenn Sie ein Objekt auf dem Stack erstellen (CObj obj;), wird ihm ebenfalls Speicher auf dem Stack zugewiesen.

In mql gibt es so etwas nicht - (CObj obj;).

 
Vladimir Simakov:

Ein klassisches Leck. Einem Zeiger, der auf dem Stack erstellt und bei der Erstellung mit dem an die Funktion übergebenen Wert initialisiert wurde, wurde ein neuer Wert zugewiesen und er wurde zu einem Zeiger auf ein neues Objekt. Danach wurde der Zeiger beim Ausklappen des Stapels sicher gelöscht. Das ist genau das, was wir beweisen mussten. Das ist genau der richtige Ort dafür:

Verwechseln Sie das Geschenk Gottes nicht mit einem Ei. Ein Grund mehr, idiotischen Code zu schreiben, um eine fehlerhafte Aussage zu beweisen...

 
Dmitry Fedoseev:

So etwas gibt es in mql nicht - (CObj obj;)

Komm schon! Ich benutze sie ständig.
 
Vladimir Simakov:
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Ein klassisches Leck. Einem Zeiger, der auf dem Stack erstellt und bei der Erstellung mit dem an die Funktion übergebenen Wert initialisiert wurde, wurde ein neuer Wert zugewiesen und er wurde zu einem Zeiger auf ein neues Objekt. Danach wurde der Zeiger beim Ausklappen des Stapels sicher gelöscht. Das ist genau das, was wir beweisen mussten. Das ist genau der richtige Ort dafür:

Warum sollten Sie einen an eine Funktion übergebenen Zeiger absichtlich neu zuweisen? Natürlich wird es eine undichte Stelle geben. Es handelt sich jedoch nicht um ein "klassisches Leck", sondern um einen klassischen Fehler bei der Arbeit mit einem Zeiger auf ein Objekt.

Sie müssen hier kein neues Objekt erstellen, sondern das externe Objekt behandeln, dessen Zeiger an die Funktion übergeben wurde.

 
Vladimir Simakov:
Komm schon! Ich benutze sie ständig.

Wo? Wo und wie?

Grund der Beschwerde: