Fehler, Irrtümer, Fragen - Seite 1785

 
fxsaber:
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
 
A100:
Ich brauche es für Code-Kompatibilität mit C++, weil Destruktoren dort anders sind
Verstanden, danke. Portieren Sie häufig nach MQL5? - Ist das der Grund, warum die Beispiele so spezifisch sind?
 
fxsaber:
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.

 
fxsaber:
Verstanden, danke. Portieren Sie häufig nach MQL5? - Ist das der Grund, warum die Beispiele so spezifisch sind?
Ich portiere nicht viel. Nur auf den ersten Blick spezifisch. Einige "Experten" haben hier geschrieben, dass mehr als 3 Derivatklassen schädlich sind. Ich habe oft nur 3-4 Basisklassen, die richtig initialisiert werden müssen, und erst dann kommen die echten Derivate.
 
int main()
{
    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.

 
A100:
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
Ich würde gerne ein Beispiel dafür sehen, wie Profis (aus meiner Sicht) in MQL5 schreiben.
 
fxsaber:

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.
 
Комбинатор:
Er wird von dem abgeleiteten Destruktor implizit aufgerufen. Darin liegt der eigentliche Unterschied zu einfachen virtuellen Funktionen.
Ich danke Ihnen. Es stellt sich heraus, dass der virtuelle Destruktor nicht nur eine virtuelle Funktion ist, die aufgerufen wird, während ein Objekt zerstört wird, sondern ein komplizierteres Gebilde.
 
fxsaber:
Nun, er muss das Objekt löschen. Das ist der schwierige Teil.
 
Alexey Kozitsyn:

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!

Wenn wir OnCalculate durch OnTick ersetzen, treten keine Fehler auf. Das Problem ist nicht in SymbolInfoTick, das Problem ist, dass Indikatoren sind krumm konfiguriert nicht zu überspringen.