Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 598

 
Juer:

Pouvez-vous me dire si je suis en train de créer un objet CArrayObj et d'y ajouter d'autres objets ? J'ai toujours besoin des objets eux-mêmes. Et je peux supprimer cet objet liste.

Quelle méthode dois-je utiliser pour retirer des objets avant de les supprimer ? Detach() ou Delete()?

Ou Clear() / Shutdown() ?

La confusion vient du fait que vous ne comprenez pas comment la mémoire est allouée et comment elle doit être gérée. Dans le cas général, ni CArrayObj ni les objets qui s'y trouvent, Il n'est pas nécessaire de supprimer manuellement.

// Где-то в коде есть объект CArrayObj
CArrayObj ArrayOfItems;
...
//Где-то в коде заполнили коллекцию пользовательскими объектами
void Create()
{
  ArrayOfItems.Add(new CUserItem());
  ArrayOfItems.Add(new CUserItem());
  //...
  ArrayOfItems.Add(new CUserItem());
}
// Так не правильно делать. Удалять ничего не надо.
void OnDeinit(const int reason)
{
   delete ArrayOfItems;
}
 

Je passe un objet à la fonction de classe, une référence à cet objet, afin que les actions de la fonction lui soient appliquées, et qu'il soit ensuite renvoyé. Mais je n'ai plus besoin de l'objet classe lui-même... Alors, comment je le supprime ?

for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=test_objects.At(i);
   if(!CheckPointer(test_object)
        continue;
   CTestClass *test_class=new CTestClass();
   if(test_class.Check(test_object))
        res=true;
   delete test_class;
  }

Comme ça. Lorsque je supprime test_class, il est indiqué Invalid pointer at the next iteration...

Comment puis-je supprimer test_class sans supprimer l'objet qui lui est passé ?

 
Vasiliy Sokolov:

Vous êtes confus parce que vous ne comprenez pas comment la mémoire est allouée et comment elle doit être gérée. Dans le cas général, ni CArrayObj ni les objets qu'il contient , il n'est pas nécessaire de supprimer manuellement.

Eh bien, si j'ai créé un tableau d'objets. C'est-à-dire que j'ai créé un objet tableau ArrayObj, j'ai effectué les actions nécessaires avec lui. Ensuite, je n'ai pas besoin de cet objet, mais j'ai besoin des objets eux-mêmes à l'intérieur (membres du tableau), ne devrais-je pas supprimer cet objet tableau ?

 

Ce vv Ihor Herasko arrivera jusqu'au week-end, et il n'y est pas ; )

les questions sont en attente depuis jeudi dernier ! : )

je suis responsable de mes critiques après tout, et je vous ai donné une bonne critique, soyez gentil et finissez votre jeu à la "je réponds à 1 question par jour", parce que je ne suis pas excité d'attendre, et je n'ai pas vraiment envie de relire ma critique. à ce rythme, je vais devoir attendre toute la semaine prochaine, et je dois donner le hibou à un freelance pour la révision ; )
 
Juer:

Je passe un objet à la fonction de classe, une référence à cet objet, afin que les actions de la fonction lui soient appliquées, puis il est renvoyé. Mais je n'ai plus besoin de l'objet classe lui-même... Alors, comment je le supprime ?

Comme ça. Lorsque je supprime test_class, il est indiqué Invalid pointer at the next iteration...

Comment supprimer test_class sans supprimer l'objet qui lui est passé ?

Vous devez éviter de créer des pointeurs vers des objets. Au lieu de cela, travaillez avec des objets directement sur la pile de la fonction :

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=dynamic_cast<CTestObject*>(test_objects.At(i));
   if(test_object == NULL)
        continue;
   if(test_class.Check(test_object))
        res=true;
  }

Puisque test_object est assuré de contenir des CTestObjects (vous n'avez rien ajouté en dehors de ces objets, n'est-ce pas ? :), vous pouvez simplifier le code en supprimant la vérification du fantôme :

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   CTestObject *test_object = test_objects.At(i);
   bool res = test_class.Check(test_object);   
  }

Et juste brièvement :

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
   bool res = test_class.Check((CTestObject)test_objects.At(i));
 
Juer:

Eh bien, si j'ai créé un tableau d'objets. C'est-à-dire que j'ai créé un objet tableau ArrayObj, j'ai effectué les actions nécessaires avec lui. Alors je n'ai pas besoin de cet objet, mais j'ai besoin des objets eux-mêmes à l'intérieur (membres du tableau), ne devrais-je pas supprimer cet objet tableau ?

Vous ne comprenez pas l'utilité de CArrayObj. Il est le propriétaire des objets que vous y placez. Si vous supprimez CArrayObj, les objets que vous y avez placés seront également supprimés. Comme ArrayObj est le propriétaire de ces objets, il est également leur gestionnaire - il contrôle les références aux objets et supprime automatiquement toute la mémoire allouée lorsque la collection n'est plus nécessaire. Vous n'avez donc pas besoin de libérer quoi que ce soit et d'utiliser l'opérateur de suppression. Tout est fait par CArrayObj lui-même. Le CArrayObj lui-même ne prend presque pas de mémoire dans l'ordinateur (quelques dizaines d'octets), il est donc inutile d'essayer de le supprimer.

 
Vasiliy Sokolov:

Vous ne comprenez pas l'utilité de CArrayObj. Il est le propriétaire des objets que vous y placez. Si vous supprimez CArrayObj, les objets que vous y avez placés seront également supprimés. Comme ArrayObj est le propriétaire de ces objets, il est également leur gestionnaire - il contrôle les références aux objets et supprime automatiquement toute la mémoire allouée lorsque la collection n'est plus nécessaire. Vous n'avez donc pas besoin de libérer quoi que ce soit et d'utiliser l'opérateur de suppression. Tout est fait par CArrayObj lui-même. Le CArrayObj lui-même ne prend presque pas de mémoire dans l'ordinateur (quelques dizaines d'octets), il est donc inutile d'essayer de le supprimer.

Mais ensuite, les erreurs d'objets non supprimés CArrayObj

 
Juer:

Mais ensuite, les erreurs d'objets non supprimés CArrayObj

Ils ont donc fait une erreur avec CArrayObj. Au lieu de CArrayObj test_objects ; ils ont écrit CArrayObj* test_objects mais ont oublié de créer un constructeur pour celui-ci; Peut-être que le modèle de mémoire pour gérer CArrayObj était incorrectement configuré. Peut-être que les programmeurs ont simplement exagéré avec les pointeurs. Le diagnostic est clair : l'utilisation de pointeurs là où ils ne sont pas nécessaires provoque souvent des fuites.

 

Bonjour !

Pouvez-vous me dire comment déplacer le curseur à, disons, la ligne 7 dans un document texte, pour extraire une sous-chaîne de cette position...

Qu'est-ce qui est le plus rapide - plusieurs fichiers texte avec une ligne ou un fichier avec plusieurs lignes ?

 
Vasiliy Sokolov:

Ils ont donc fait une erreur avec CArrayObj. Au lieu de : CArrayObj test_objects ; Ils ont écrit : CArrayObj* test_objects, mais ont oublié de créer un destructeur pour celui-ci; Peut-être ont-ils mal configuré le modèle de mémoire pour fonctionner avec CArrayObj. Peut-être que les programmeurs ont simplement exagéré avec les pointeurs. Le diagnostic est clair : l'utilisation de pointeurs là où ils ne sont pas nécessaires provoque souvent des fuites.

Mais où en a-t-on le plus besoin ? Quel est l'intérêt de les utiliser si l'on peut se contenter de déclarer des objets ?

Raison: