Errori, bug, domande - pagina 1785

 
fxsaber:
So a cosa serve il distruttore. Non mi è chiaro perché la parola virtuale debba essere scritta prima della sua definizione.
Ne ho bisogno per la compatibilità del codice con C++, perché i distruttori sono diversi lì
 
A100:
Ne ho bisogno per la compatibilità del codice con C++, perché i distruttori sono diversi lì
Capito, grazie. Fate spesso il porting su MQL5? - È per questo che gli esempi sono così specifici?
 
fxsaber:
So a cosa serve il distruttore. Non capisco perché dobbiamo aggiungere la parola virtuale prima della sua definizione.

Funzioni virtuali e distruttore >>>.

La regola di base: se avete almeno una funzione virtuale nella vostra classe, anche il distruttore dovrebbe essere virtuale. Ricordate che il distruttore non è virtuale di default, quindi dovreste dichiararlo esplicitamente. Se non lo fate, siete quasi certi di avere perdite di memoria nel vostro programma. Anche in questo caso non ci vuole molta intelligenza per capire il perché. Vediamo alcuni esempi.

 
fxsaber:
Capito, grazie. Fate spesso il porting su MQL5? - È per questo che gli esempi sono così specifici?
Non faccio molti porting. Specifico solo a prima vista. Alcuni "esperti" hanno scritto qui che più di 3 classi di derivati è dannoso. Spesso ho solo 3-4 classi base che hanno bisogno di una corretta inizializzazione e solo allora arrivano i veri derivati.
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

Questa volta l'oggetto viene costruito come dovrebbe essere, ma quando viene distrutto, si verifica una perdita di memoria, perché il distruttore della classe derivata non viene chiamato.

La ragione è che la cancellazione viene eseguita attraverso un puntatore a una classe base e il compilatore usa il binding anticipato per chiamare il distruttore. Il distruttore della classe base non può chiamare il distruttore della classe derivata perché non ne sa nulla. Come risultato, parte della memoria allocata per la classe derivata è irrimediabilmente persa.

Per evitare questo, il distruttore nella classe base deve essere dichiarato come virtuale.

Non capisco architettonicamente perché, rendendo virtuale il distruttore di base, appaiono informazioni sul distruttore derivato.

Ora capisco che quando la base è virtuale, allora definendo un distruttore derivato facciamo una sostituzione del distruttore derivato invece del distruttore della base. Ma allora il distruttore di base non dovrebbe essere chiamato in questo esempio.

Ovviamente, non capisco come funziona. Non ho mai avuto problemi con le funzioni virtuali in MQL5. Mi piace molto l'OOP grazie a loro. Pensavo di aver capito tutto. Ora ho un dilemma completo. Per favore, me lo spieghi nei suoi termini.

 
A100:
Ritrarre poco. Specifico solo a prima vista. Alcuni "esperti" hanno scritto qui che TUTTO più di 3 classi di derivati è dannoso. Spesso ho solo 3-4 classi base da inizializzare correttamente e solo allora iniziano i veri derivati
Mi piacerebbe vedere un esempio di come i professionisti (dal mio punto di vista) scrivono in MQL5.
 
fxsaber:

Ma allora il distruttore di base non dovrebbe essere chiamato in questo esempio.

Viene chiamato dal distruttore derivato implicitamente. Questo è in realtà ciò che lo rende diverso dalle semplici funzioni virtuali.
 
Комбинатор:
Viene chiamato dal distruttore derivato implicitamente. Questo è in realtà ciò che lo rende diverso dalle semplici funzioni virtuali.
Grazie. Si scopre che il distruttore virtuale non è solo una funzione virtuale che viene chiamata mentre l'oggetto viene distrutto, ma un'entità più complicata.
 
fxsaber:
Beh, deve cancellare l'oggetto, questa è la parte difficile
 
Alexey Kozitsyn:

Errore di SymbolInfoTick() che restituisce dati irrilevanti - tick overshoot. Build 1525 x64. Test da indicatore, non testato su Expert Advisor:

Reale, Apertura, Access Server V. Tristezza! Prestate attenzione al problema, per favore. E anche al problema nella domanda#1598238 (a partire da pagina 10, post del2017.01.26 09:43).

Cari sviluppatori, sistemiamo i tic! Codice fornito, eccolo - il problema, non c'è bisogno di cercare nulla, basta reagire e risolverlo!

Se sostituiamo OnCalculate con OnTick, non si verificano errori. Il problema non è in SymbolInfoTick, il problema è che gli indicatori sono configurati in modo sbagliato per non saltare.