Bibliothèque de classes génériques - bogues, description, questions, caractéristiques d'utilisation et suggestions - page 26
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
Vous créez des copies d'objets dans AddValue via new, mais vous ne les libérez pas dans le destructeur, vous effacez simplement la liste des pointeurs.
L'aide indique que l'appel d'un destructeur appelle également les destructeurs des classes que vous avez utilisées.
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
Je ne me souviens pas d'un cas où le terminal n'a pas écrit dans le journal un avertissement concernant les objets non détruits après le déchargement du script - mon exemple ne montre pas un tel avertissement.
Deuxièmement, vous auriez dû le faire correctement avec le constructeur de copie au lieu de l'opérateur d'affectation. Mais tout ceci est IMHO).
J'ai trouvé des informations de la part de développeurs selon lesquelles les structures ou les classes simples en MQL sont toujours copiées sans aucun problème, je l'ai vérifié plusieurs fois et cela semble être vrai, pour autant que j'utilise les fonctionnalités du langage.
C'est sur ce point que porte la discussion - MQL n'est pas C++, j'ai arrêté de chercher des analogies entre les deux, les développeurs ont écrit que c'est ainsi qu'il est implémenté - je l'ai vérifié, cela fonctionne - donc vous pouvez l'utiliser, si la syntaxe standard C++ est cruciale, vous pouvez facilement écrire toute la logique en .dll.
Vous créez des copies d'objets dans AddValue via new, mais vous ne les libérez pas dans le destructeur, vous effacez simplement la liste des pointeurs.
Oh, mon Dieu ! Et comment supprimer une instance d'une classe créée via new dans le destructeur. Essayez de le faire. Cela ne fonctionnera pas.
Vous ne pouvez le faire que dans le destructeur d'une autre classe.
Oh, merde ! Et comment supprimer une instance d'une classe créée via new dans le destructeur. Vous pouvez l'essayer. Cela ne fonctionnera pas.
Vous ne pouvez le faire que dans le destructeur d'une autre classe.
Je parlais du destructeur d'une autre classe. Je parlais des éléments créés par new dans la méthodeAddValue.
L'aide indique que lorsque le destructeur est appelé, les destructeurs des classes utilisées seront également appelés.
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
Je ne me souviens pas d'un cas où le terminal n'a pas écrit un avertissement sur les objets non détruits dans le journal après le déchargement du script - mon exemple ne montre pas un tel avertissement.
j'ai entendu dire par les développeurs que les structures ou classes simples en MQL sont toujours copiées sans aucun problème, je l'ai vérifié plusieurs fois et cela semble être vrai, jusqu'à présent j'utilise les possibilités du langage
C'est sur ce point que porte la discussion - MQL n'est pas C++, j'ai arrêté de chercher des analogies entre les deux, les développeurs ont écrit que c'est ainsi qu'il est implémenté - je l'ai vérifié, cela fonctionne - donc vous pouvez l'utiliser, si la syntaxe standard C++ est cruciale, je ne devrais pas avoir à m'inquiéter de mettre toute la logique dans une .dll.
Oui, je l'ai vu dans l'aide... Très implicite, cela ressemble plus à une béquille, au lieu de unique_ptr...
Oui, je l'ai vu dans l'aide... Chose très implicite, plutôt comme une béquille à la place de unique_ptr...
Et c'est tellement pratique que je ne peux même pas appeler ça une béquille :
Créez un objet de n'importe quelle classe, placez-le dans une liste de stockage, et vous n'avez plus à vous soucier de le supprimer - le sous-système du terminal le nettoie de lui-même.
Mais vous pouvez également définir une opération manuelle et "exécuter" pour tous les objets nouvellement créés en essayant de savoir quand, où et dans quel but ils ont été créés et s'ils sont nécessaires maintenant. S'il n'est pas nécessaire, supprimez-le. Mais lorsque vous avez fait une erreur, il s'avère que c'était nécessaire - il se plante en accédant à un pointeur invalide...
La béquille consiste donc à "chasser les objets" en recherchant leur inutilité et en s'inquiétant des fuites de mémoire si un objet n'a pas été rattrapé.
Deuxièmement, la bonne chose à faire est d'utiliser le constructeur de copie au lieu de l'opérateur d'affectation. Mais c'est tout IMHO)
Pouvez-vous me donner un exemple de la façon de le copier correctement pour ce modèle ?
J'ai utilisé l'aide pour écrire la méthode AddValuehttps://www.mql5.com/ru/docs/basis/types/classes.
Je me suis creusé la tête, mais je ne vois pas d'autre solution dans MQL que celle que j'ai écrite dans mon exemple !
Montrez-moi votre mise en œuvre d'un stockage correct des données
Et c'est tellement pratique qu'on ne peut même pas appeler ça une béquille :
Créez n'importe quel objet de n'importe quelle classe, placez-le dans la liste de stockage, et vous n'avez plus à vous soucier de le supprimer - le sous-système terminal le nettoie de lui-même.
Mais vous pouvez également paramétrer une opération manuelle et "exécuter" tous les objets nouvellement créés en essayant de savoir quand, où et dans quel but ils ont été créés et s'ils sont nécessaires maintenant. S'il n'est pas nécessaire, supprimez-le. Mais lorsque vous avez fait une erreur, il s'avère que c'était nécessaire - il se plante en accédant à un pointeur invalide...
La béquille consiste donc à "chasser les objets" en recherchant leur inutilité et en s'inquiétant des fuites de mémoire si un objet n'a pas été rattrapé.
L'idée est qu'une fois que vous ajoutez un pointeur à la collection, il reste également avec vous. C'est le premier.
L'aide indique que lorsque le destructeur est appelé, les destructeurs des classes utilisées seront également appelés.
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
Je ne me souviens pas d'un cas où le terminal n'a pas écrit un avertissement sur les objets non détruits dans le journal après le déchargement du script - mon exemple ne montre pas un tel avertissement.
j'ai entendu dire par les développeurs que les structures ou classes simples en MQL sont toujours copiées sans aucun problème, je l'ai vérifié plusieurs fois et cela semble être vrai, jusqu'à présent j'utilise les possibilités du langage
C'est sur ce point que porte la discussion - MQL n'est pas C++, j'ai renoncé à chercher des analogies entre les deux, les développeurs ont écrit que c'est ainsi qu'il est implémenté - je l'ai vérifié, cela fonctionne - donc vous pouvez l'utiliser, si la syntaxe standard C++ est cruciale, vous pouvez facilement écrire toute la logique en .dll.
Peut-on faire un réseau triangulaire avec ça ?
En raison des limitations linguistiques, il est peu probable que quelque chose de décent fonctionne. J'ai cette béquille (une enveloppe légère sur un tableau standard).
Pour stocker des pointeurs, écrivez un wrapper unic_ptr (bien que vous ne puissiez pas en obtenir un complet, mais au moins auto_ptr). À mon avis, même une telle primitive est beaucoup plus pratique que les contreparties des modèles de std.