Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 598

 
Juer:

Können Sie mir sagen, wenn ich ein CArrayObj-Objekt erstellen und andere Objekte zu ihm hinzufügen? Ich brauche noch die Objekte selbst. Und ich kann dieses Listenobjekt löschen.

Welche Methode sollte ich verwenden, um Objekte vor dem Löschen aus dem Dokument zu entfernen? Detach() oder Delete()?

Oder Clear() / Shutdown() ?

Die Verwirrung rührt daher, dass Sie nicht verstehen, wie Speicher zugewiesen wird und wie er gehandhabt werden sollte. Im Allgemeinen werden weder CArrayObj noch die darin enthaltenen Objekte, Manuelles Löschen ist nicht erforderlich.

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

Ich übergebe ein Objekt an die Klassenfunktion, einen Verweis darauf, so dass die Aktionen in der Funktion mit ihm geschehen, und dann wird es zurückgegeben werden. Aber ich brauche das Klassenobjekt selbst nicht mehr... Wie kann ich sie also löschen?

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;
  }

Zum Beispiel so. Wenn ich test_class lösche, heißt es bei der nächsten Iteration Ungültiger Zeiger...

Wie kann ich test_class löschen, ohne das übergebene Objekt zu löschen?

 
Vasiliy Sokolov:

Sie sind verwirrt, weil Sie nicht verstehen, wie Speicher zugewiesen wird und wie er gehandhabt werden sollte. Im allgemeinen Fall können weder CArrayObj noch die darin enthaltenen Objekte , ein manuelles Löschen ist nicht erforderlich.

Nun, wenn ich ein Array von Objekten erstellt habe. Das heißt, ich habe ein Array-Objekt ArrayObj erstellt und die notwendigen Aktionen damit durchgeführt. Dann brauche ich dieses Objekt nicht, sondern die Objekte selbst (Array-Mitglieder), sollte ich dieses Array-Objekt nicht löschen?

 

Diese vv Ihor Herasko wird es bis zum Wochenende zu machen, und es ist nicht da ; )

Die Fragen sind seit letztem Donnerstag offen! : )

ich bin schließlich für meine bewertungen verantwortlich, und ich habe dir eine gute bewertung gegeben, sei nett, beende dein spiel a la "ich beantworte 1 frage pro tag", denn ich bin nicht begeistert vom warten, und ich habe nicht wirklich Lust, meine bewertung Korrektur zu lesen. bei diesem tempo werde ich die ganze nächste woche warten müssen, und ich muss die eule an einen freiberufler zur überarbeitung geben ; )
 
Juer:

Ich übergebe ein Objekt an die Klassenfunktion, einen Verweis darauf, so dass die Aktionen in der Funktion mit ihm geschehen, und dann wird es zurückgegeben werden. Aber ich brauche das Klassenobjekt selbst nicht mehr... Wie kann ich sie also löschen?

Zum Beispiel so. Wenn ich test_class lösche, heißt es bei der nächsten Iteration Ungültiger Zeiger...

Wie kann ich test_class löschen, ohne das übergebene Objekt zu löschen?

Sie müssen vermeiden, Zeiger auf Objekte zu erstellen. Arbeiten Sie stattdessen mit Objekten direkt auf dem Stapel der Funktion:

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;
  }

Da test_object garantiert CTestObjects enthält (Sie haben außer diesen Objekten nichts hinzugefügt, richtig?:), können Sie den Code vereinfachen, indem Sie die Ghost-Prüfung entfernen:

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);   
  }

Und nur kurz:

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

Nun, wenn ich ein Array von Objekten erstellt habe. Das heißt, ich habe ein Array-Objekt ArrayObj erstellt und die notwendigen Aktionen damit durchgeführt. Dann brauche ich dieses Objekt nicht, aber ich brauche die Objekte selbst darin (Array-Mitglieder), sollte ich dieses Array-Objekt nicht löschen?

Du verstehst den Zweck von CArrayObj nicht. Er ist der Eigentümer der Objekte, die Sie in ihm platzieren. Wenn Sie CArrayObj entfernen, werden auch die Objekte, die Sie darin abgelegt haben, entfernt. Da ArrayObj der Eigentümer dieser Objekte ist, ist es auch ihr Manager - es kontrolliert die Verweise auf die Objekte und löscht automatisch den gesamten zugewiesenen Speicher, wenn die Sammlung nicht mehr benötigt wird. Sie brauchen also nichts freizugeben und den Löschoperator zu verwenden. Alles wird von CArrayObj selbst erledigt. Das CArrayObj selbst nimmt im Computer fast keinen Speicherplatz ein (ein paar Dutzend Bytes), so dass es sinnlos ist, es zu löschen.

 
Vasiliy Sokolov:

Sie verstehen den Zweck von CArrayObj nicht. Er ist der Eigentümer der Objekte, die Sie in ihm platzieren. Wenn Sie CArrayObj entfernen, werden auch die Objekte, die Sie dort abgelegt haben, entfernt. Da ArrayObj der Eigentümer dieser Objekte ist, ist es auch ihr Manager - es kontrolliert die Verweise auf die Objekte und löscht automatisch den gesamten zugewiesenen Speicher, wenn die Sammlung nicht mehr benötigt wird. Sie brauchen also nichts freizugeben und den Löschoperator zu verwenden. Alles wird von CArrayObj selbst erledigt. Das CArrayObj selbst nimmt im Computer fast keinen Speicherplatz ein (ein paar Dutzend Bytes), so dass es keinen Sinn macht, es zu löschen.

Aber dann Fehler ungelöschte Objekte CArrayObj

 
Juer:

Aber dann Fehler ungelöschte Objekte CArrayObj

Sie haben also einen Fehler mit CArrayObj. Sie haben CArrayObj* test_objects anstelle von CArrayObj geschrieben, aber vergessen, einen Konstruktor dafür zu erstellen; vielleicht haben sie das Speichermodell falsch konfiguriert, um CArrayObj zu behandeln. Vielleicht haben es die Programmierer mit den Zeigern einfach übertrieben. Die Diagnose ist eindeutig: Die Verwendung von Zeigern an Stellen, an denen sie nicht benötigt werden, führt häufig zu Lecks.

 

Hallo!

Können Sie mir sagen, wie ich den Cursor in einem Textdokument z. B. auf Zeile 7 bewegen kann, um eine Teilzeichenkette von dieser Position aus zu extrahieren?

Was ist schneller - mehrere Textdateien mit einer Zeile oder eine Datei mit mehreren Zeilen?

 
Vasiliy Sokolov:

Sie haben also einen Fehler mit CArrayObj. Statt: CArrayObj test_objects; Sie schrieben: CArrayObj* test_objects, vergaßen aber, einen Destruktor dafür zu erstellen; Vielleicht haben sie das Speichermodell für die Arbeit mit CArrayObj falsch konfiguriert. Vielleicht haben sie es mit den Zeigern einfach übertrieben. Die Diagnose ist eindeutig: Die Verwendung von Zeigern an Stellen, an denen sie nicht benötigt werden, führt häufig zu Lecks.

Aber wo werden sie überhaupt gebraucht? Was nützt es, sie zu verwenden, wenn man einfach Objekte deklarieren kann?