Fehler, Irrtümer, Fragen - Seite 1785
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich weiß, wofür der Destruktor da ist. Es ist mir nicht klar, warum das Wort "virtuell" vor seiner Definition stehen sollte.
Ich brauche es für Code-Kompatibilität mit C++, weil Destruktoren dort anders sind
Ich weiß, wofür der Destruktor verwendet wird. Ich verstehe nicht, warum wir das Wort "virtuell" vor seiner Definition hinzufügen müssen.
Virtuelle Funktionen und Destruktor >>>
Die Grundregel: Wenn Sie mindestens eine virtuelle Funktion in Ihrer Klasse haben, sollte auch der Destruktor virtuell sein. Denken Sie daran, dass der Destruktor standardmäßig nicht virtuell ist, Sie sollten ihn also explizit deklarieren. Wenn Sie dies nicht tun, werden Sie mit ziemlicher Sicherheit Speicherlecks in Ihrem Programm haben. Auch hier braucht es nicht viel Intelligenz, um zu verstehen, warum. Sehen wir uns einige Beispiele an.
Verstanden, danke. Portieren Sie häufig nach MQL5? - Ist das der Grund, warum die Beispiele so spezifisch sind?
Virtuelle Funktionen und Destruktor >>>
{
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}
Diesmal wird das Objekt ordnungsgemäß konstruiert, aber wenn es zerstört wird, kommt es zu einem Speicherleck, weil der Destruktor der abgeleiteten Klasse nicht aufgerufen wird.
Der Grund dafür ist, dass das Löschen über einen Zeiger auf eine Basisklasse erfolgt und der Compiler den Destruktor durch frühes Binden aufruft. Der Destruktor der Basisklasse kann den Destruktor der abgeleiteten Klasse nicht aufrufen, da er nichts über sie weiß. Dies hat zur Folge, dass ein Teil des für die abgeleitete Klasse zugewiesenen Speichers unwiederbringlich verloren geht.Um dies zu vermeiden, muss der Destruktor in der Basisklasse als virtuell deklariert werden.
Ich verstehe architektonisch nicht, warum der Basis-Destruktor virtuell gemacht wird und dadurch Informationen über den abgeleiteten Destruktor erscheinen.
Jetzt verstehe ich, dass, wenn die Basis virtuell ist, wir durch die Definition eines abgeleiteten Destruktors einen Ersatz für den abgeleiteten Destruktor anstelle des Basis-Destruktors schaffen. Aber dann sollte der Basisdestruktor in diesem Beispiel nicht aufgerufen werden.
Offensichtlich verstehe ich nicht, wie das funktioniert. Ich habe noch nie Probleme mit virtuellen Funktionen in MQL5 gehabt. Ich mag viele OOP wegen ihnen. Ich dachte, ich hätte alles verstanden. Jetzt habe ich ein totales Dilemma. Bitte erklären Sie mir das in Ihren eigenen Worten.
Wenig darzustellen. Nur auf den ersten Blick spezifisch. Einige "Experten" schrieben hier, dass ALLES, was mehr als 3 Derivatklassen hat, schädlich ist. Ich muss oft nur 3-4 Basisklassen richtig initialisieren und erst dann beginnen die echten Derivate
Aber dann sollte der Basisdestruktor in diesem Beispiel nicht aufgerufen werden.
Er wird von dem abgeleiteten Destruktor implizit aufgerufen. Darin liegt der eigentliche Unterschied zu einfachen virtuellen Funktionen.
SymbolInfoTick() -Fehler, der irrelevante Daten zurückgibt - Tick-Überschwinger. Build 1525 x64. Test mit Indikator, nicht mit Expert Advisor getestet:
Real, Eröffnung, Access Server V. Traurigkeit! Kümmern Sie sich bitte um das Problem. Und auch zu dem Problem in Antrag#1598238 (ab Seite 10, Beitrag vom26.01.2017 09:43).
Liebe Entwickler, lasst uns die Zecken beseitigen! Code zur Verfügung gestellt, hier ist es - das Problem, keine Notwendigkeit, nach etwas zu suchen, reagieren Sie einfach und beheben Sie es!