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 敤敬整渠湯搠湹浡捩漠橢捥tWurde die Reaktion des Terminals auf das Löschen von ungültigen Zeigern seit der Veröffentlichung dieses Artikels geändert? XP, 32
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, 32mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.
Warum führt diese Zeile dazu, dass der Konstruktor ausgeführt wird?
CItem* array1[5];und diese hier nicht:
CObjectC *pObjectC;?
- www.mql5.com
Warum führt diese Zeile dazu, dass der Konstruktor aufgerufen wird:
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.
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?
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?
- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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.