Erreurs, bugs, questions - page 1785
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'en ai besoin pour la compatibilité avec le code C++, car les destructeurs sont différents dans ce cas.
Je sais à quoi sert le destructeur. Je ne comprends pas pourquoi nous devons ajouter le mot virtuel avant sa définition.
Fonctions virtuelles et destructeur >>>
La règle de base : si vous avez au moins une fonction virtuelle dans votre classe, le destructeur doit également être virtuel. N'oubliez pas que le destructeur n'est pas virtuel par défaut, vous devez donc le déclarer explicitement. Si vous ne le faites pas, vous êtes presque certain d'avoir des fuites de mémoire dans votre programme. Encore une fois, il ne faut pas être très intelligent pour comprendre pourquoi. Examinons plusieurs exemples.
Je l'ai, merci. Faites-vous beaucoup de portage vers MQL5 ? - C'est pour cela que les exemples sont si spécifiques ?
Fonctions virtuelles et destructeur >>>
{
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}
Cette fois, l'objet est construit comme il se doit, mais lorsqu'il est détruit, une fuite de mémoire se produit, car le destructeur de la classe dérivée n'est pas appelé.
La raison en est que la suppression est effectuée par le biais d'un pointeur vers une classe de base et que le compilateur utilise une liaison précoce pour appeler le destructeur. Le destructeur de la classe de base ne peut pas appeler le destructeur de la classe dérivée car il ne sait rien de celle-ci. En conséquence, une partie de la mémoire allouée à la classe dérivée est irrémédiablement perdue.Pour éviter cela, le destructeur de la classe de base doit être déclaré comme virtuel.
Je ne comprends pas, d'un point de vue architectural, pourquoi, en rendant le destructeur de base virtuel, des informations sur le destructeur dérivé apparaissent.
Je comprends maintenant que lorsque la base est virtuelle, en définissant un destructeur dérivé, nous remplaçons le destructeur de la base par un destructeur dérivé. Mais alors le destructeur de la base ne devrait pas être appelé dans cet exemple.
De toute évidence, je ne comprends pas comment cela fonctionne. Je n'ai jamais eu de problèmes avec les fonctions virtuelles dans MQL5. J'aime beaucoup les OOP à cause d'eux. Je pensais avoir tout compris. Maintenant, j'ai un vrai dilemme. Expliquez-le-moi en vos propres termes.
Le portrait d'un petit. Spécifique seulement à première vue. Certains "experts" ont écrit ici que TOUT ce qui dépasse les 3 classes dérivées est nocif. Je n'ai souvent que 3 ou 4 classes de base à initialiser correctement et ce n'est qu'ensuite que les vrais dérivés commencent.
Mais alors le destructeur de la base ne devrait pas être appelé dans cet exemple.
Il est appelé implicitement par le destructeur dérivé. C'est en fait ce qui la différencie des simples fonctions virtuelles.
L'erreur SymbolInfoTick() renvoie des données non pertinentes - dépassement de tick. Build 1525 x64. Test à partir de l'indicateur, n'a pas été testé sur Expert Advisor :
Real, Opening, Access Server V. La tristesse ! Faites attention au problème, s'il vous plaît. Et aussi au problème de la demande#1598238 (à partir de la page 10, post du2017.01.26 09:43).
Chers développeurs, corrigeons les tics ! Code fourni, voilà le problème, pas besoin de chercher quoi que ce soit, il suffit de réagir et de le régler !
Si OnCalculate est remplacé par OnTick, aucune erreur ne se produit. Le problème n'est pas SymbolInfoTick, mais le fait que les indicateurs ne sont pas correctement paramétrés pour l'absence de sauts.