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

 

Neuer Artikel Die Reihenfolge der Erstellung und Zerstörung von Objekten in MQL5 :

Jedes Objekt, ob es sich um ein benutzerdefiniertes Objekt, ein dynamisches Array oder ein Array von Objekten handelt, wird im MQL5-Programm auf seine festgelegte Art erstellt und gelöscht. Oft sind bestimmte Objekte Teil anderer Objekte und die Reihenfolge der Löschung von Objekten bei der Deinitialisierung wird besonders wichtig. In diesem Beitrag finden Sie einige Beispiele, die die Mechanismen der Arbeit mit Objekten behandeln.

Das Konzept von MQL5-Programmen ist die objektorientierte Programmierung (OOP). Dies sorgt nicht nur für neue Möglichkeiten bei der Erstellung benutzerdefinierter Bibliotheken, sondern ermöglicht es Ihnen auch, vollständige und getestete Klassen von anderen Entwicklern zu benutzen. In der im MetaTrader 5 Client Terminal enthaltenen Standardbibliothek befinden sich hunderte Klassen mit tausenden Methoden.

Um alle Vorteile der OOP nutzen zu können, müssen wir einige Details zur Erstellung und Löschung von Objekten in MQL5-Programmen klären. Die Erstellung und Löschung von Objekten wird in der Dokumentation kurz beschrieben. Dieser Beitrag illustriert dieses Thema durch einige Beispiele.

Autor: MetaQuotes Software Corp.

 

Wenn LocalVar_TestScript_2.mq5 zum ersten Mal ausgeführt wird, gibt es nur

PO      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
LD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
HJ      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
DS      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
PH      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
GP      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
KF      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
OM      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
CD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
GK      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor

d.h. ohne die Meldung"delete invalid pointer". Nach dem erneuten Kompilieren der gleichen Datei (d.h. nach der zweiten Kompilierung) zeigt es dies an:

PQ      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
LH      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
HO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
DF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
PL      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
GR      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
KK      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
OP      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
CF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
GO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
PH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
RP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
DH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
FP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
HH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
Wurde die Reaktion des Terminals auf das Löschen von ungültigen Zeigern seit der Veröffentlichung dieses Artikels geändert? XP, 32
 
Yedelkin:

Wenn LocalVar_TestScript_2.mq5 zum ersten Mal ausgeführt wird, gibt es nur

d.h. ohne die Meldung"delete invalid pointer". Nach dem erneuten Kompilieren der gleichen Datei (d.h. nach der zweiten Kompilierung) zeigt es dies an:

Wurde die Reaktion des Terminals auf das Löschen von ungültigen Zeigern seit der Veröffentlichung dieses Artikels geändert? XP, 32
Vielen Dank für die Nachricht. Behoben. Das Verhalten hat sich geändert, jetzt wird die Meldung"delete invalid pointer" nur noch beim Kompilieren zum Debuggen erzeugt.
 

mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.

OK, wir würden gerne eine Klarstellung des Artikels sehen.
 

Warum führt diese Zeile dazu, dass der Konstruktor ausgeführt wird?

 CItem* array1[5];

und diese hier nicht:

CObjectC *pObjectC;
?
 
Der neue Operator wird nur benötigt, um die Klasse dynamisch zu machen? Aber wenn ein dynamisches Array "ein Array mit einem nicht spezifizierten Wert im ersten Paar von eckigen Klammern" ist, was ist dann eine dynamische Klasse?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Warum führt diese Zeile dazu, dass der Konstruktor aufgerufen wird:

Ich habe geprüft, dass kein Konstruktoraufruf erfolgt, bitte fügen Sie den gesamten Code bei
 
Burgunsky:

Und warum diese Zeile den Konstruktor zum Laufen bringt: CItem* array1[5];,

aber diese Zeile nicht: CObjectC *pObjectC; ?

Ich habe verstanden, dass die Zeile

CItem* array1[5];

für sich genommen nicht dazu führt, dass der Konstruktor gestartet wird. Hier ist der vollständige Code aus dem Artikel:

void OnStart()
  {
//--- das erste Array von Zeigern auf das Objekt deklarieren
   CItem* array1[5];
//--- das zweite Array mit Zeigern auf das Objekt deklarieren
   CItem* array2[5];
//--- Füllen wir nun die Arrays in der Schleife
   for(int i=0;i<5;i++)
     {
      //--- Zeiger für das erste Array wird durch den Operator new erstellt
      array1[i]=new CItem;
      //--- der Zeiger für das zweite Array wird vom ersten Array kopiert
      array2[i]=array1[i];
     }
Der Konstruktor wird nicht beim Deklarieren des ersten Zeiger-Arrays aufgerufen, sondern beim Füllen dieses Arrays in einer Schleife mit dem new-Operator.
 
Burgunsky:
Der neue Operator wird nur benötigt, um die Klasse dynamisch zu machen? Aber wenn ein dynamisches Array "ein Array mit einem nicht spezifizierten Wert im ersten Paar von eckigen Klammern" ist, was ist dann eine dynamische Klasse?
Ich habe verstanden, dass das Wort "dynamisch" in der Programmierung vielschichtig ist. Wenn es um Klassen geht, gibt es einen Gegensatz: "automatisch erstelltes Objekt" vs. "dynamisch erstelltes Objekt". Der Unterschied zwischen beiden ist ungefähr der gleiche wie zwischen Variablen, die auf globaler Ebene deklariert sind, und Variablen, die auf lokaler Ebene deklariert sind. Mit anderen Worten, ein "dynamisch erzeugtes Objekt" ist ein Objekt, das "für eine gewisse Zeit" erzeugt wird; seine Lebensdauer reicht vom Moment der Erzeugung durch den new-Operator bis zum Moment des Löschens durch den delete-Operator.
 

Aber es bleiben Fragen offen:

Welchen Sinn hat es, ein dynamisches Objekt mit dem new-Operator zu erstellen?

Bei der automatischen Erstellung eines Objekts wird das Klassenobjekt auf dem Stack erstellt, was von der Ausführungszeit her schneller ist als ein dynamisches Objekt.

Bei der dynamischen Erstellung eines Objekts wird das Klassenobjekt im Speicher (im Heap) erstellt, wobei der Speichermanager des Betriebssystems verwendet wird; der Prozess ist langsamer.

Hier eine Frage: Wenn die automatische Erstellung schneller ist, warum werden dann dynamische Objekte erstellt? Um zu verhindern, dass der Stack überläuft?

[Gelöscht]  
Die beigefügten Quellcodedateien und die Quellcodeeinschübe im HTML-Code sind jetzt vollständig ins Portugiesische übersetzt, um Ihnen die Arbeit zu erleichtern.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.