Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 598

 
Juer:

Puoi dirmi se sto creando un oggetto CArrayObj e aggiungendovi altri oggetti? Ho ancora bisogno degli oggetti stessi. E posso cancellare questo oggetto lista.

Quale metodo dovrei usare per rimuovere gli oggetti da esso prima di cancellarlo? Detach() o Delete()?

O Clear() / Shutdown() ?

La confusione è dovuta al fatto che non capite come viene allocata la memoria e come dovrebbe essere gestita. In generale, né CArrayObj né gli oggetti situati in esso, Non c'è bisogno di cancellare manualmente.

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

Passo un oggetto alla funzione di classe, un riferimento ad esso, in modo che le azioni della funzione avvengano su di esso, e poi viene restituito. Ma non ho più bisogno dell'oggetto classe stesso... Allora, come faccio a cancellarlo?

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

Come questo. Quando cancello test_class, dice Invalid pointer alla prossima iterazione...

Come posso cancellare test_class senza cancellare l'oggetto passato ad essa?

 
Vasiliy Sokolov:

Siete confusi perché non capite come viene allocata la memoria e come dovrebbe essere gestita. Nel caso generale, né CArrayObj né gli oggetti al suo interno, non c'è bisogno di cancellare manualmente.

Bene, se ho creato un array di oggetti. Cioè, ho creato un oggetto array ArrayObj, ho eseguito le azioni necessarie con esso. Allora non ho bisogno di questo oggetto, ma ho bisogno degli oggetti stessi al suo interno (membri dell'array), non dovrei cancellare questo oggetto array?

 

Questo vv Ihor Herasko arriverà al fine settimana, e non c'è ; )

le domande sono in sospeso da giovedì scorso! : )

Sono responsabile delle mie recensioni dopo tutto, e ti ho dato una buona recensione, sii gentile, finisci il tuo gioco a la "rispondo a 1 domanda al giorno", perché non sono entusiasta di aspettare, e non voglio davvero correggere la mia recensione. a questo ritmo dovrò aspettare tutta la prossima settimana, e ho bisogno di dare il gufo a un freelancer per la revisione ; )
 
Juer:

Passo un oggetto alla funzione di classe, un riferimento ad esso, in modo che le azioni della funzione avvengano su di esso, e poi viene restituito. Ma non ho più bisogno dell'oggetto classe stesso... Allora, come faccio a cancellarlo?

Come questo. Quando cancello test_class, dice Invalid pointer alla prossima iterazione...

Come posso cancellare test_class senza cancellare l'oggetto passato ad essa?

Dovete evitare di creare puntatori a oggetti. Lavorate invece con gli oggetti direttamente sullo stack della funzione:

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

Dato che test_object è garantito per contenere CTestObjects (non avete aggiunto nulla oltre a questi oggetti, giusto?:) Allora potete semplificare il codice rimuovendo il controllo fantasma:

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

E solo brevemente:

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

Bene, se ho creato un array di oggetti. Cioè, ho creato un oggetto array ArrayObj, ho eseguito le azioni necessarie con esso. Allora non ho bisogno di questo oggetto, ma ho bisogno degli oggetti stessi all'interno (membri dell'array), non dovrei cancellare questo oggetto array?

Non capite lo scopo di CArrayObj. È il proprietario degli oggetti che ci mettete dentro. Se rimuovete CArrayObj, anche gli oggetti che ci avete messo dentro saranno rimossi. Poiché ArrayObj è il proprietario di questi oggetti, è anche il loro manager - controlla i riferimenti agli oggetti e cancella automaticamente tutta la memoria allocata quando la collezione non è più necessaria. Quindi non c'è bisogno di liberare nulla e usare l'operatore di cancellazione. Tutto è fatto da CArrayObj stesso. Il CArrayObj stesso non occupa quasi nessuna memoria nel computer (poche decine di byte), quindi è inutile cercare di cancellarlo.

 
Vasiliy Sokolov:

Non capite lo scopo di CArrayObj. È il proprietario degli oggetti che ci mettete dentro. Se rimuovete CArrayObj, allora anche gli oggetti che ci avete messo dentro saranno rimossi. Poiché ArrayObj è il proprietario di questi oggetti, è anche il loro gestore - controlla i riferimenti agli oggetti e cancella automaticamente tutta la memoria allocata quando la collezione non è più necessaria. Quindi non c'è bisogno di liberare nulla e usare l'operatore di cancellazione. Tutto è fatto da CArrayObj stesso. Il CArrayObj stesso non occupa quasi nessuna memoria nel computer (poche decine di byte), quindi non ha senso cercare di cancellarlo.

Ma poi gli errori non cancellati oggetti CArrayObj

 
Juer:

Ma poi gli errori non cancellati oggetti CArrayObj

Quindi hanno fatto un errore con CArrayObj. Hanno scritto CArrayObj* test_objects invece di CArrayObj, ma hanno dimenticato di fare un costruttore per esso; forse hanno configurato male il modello di memoria per gestire CArrayObj. Forse i programmatori hanno semplicemente esagerato con i puntatori. La diagnosi è chiara: l'uso di puntatori dove non sono necessari spesso causa perdite.

 

Ciao!

Potete dirmi come spostare il cursore su, diciamo, la linea 7 in un documento di testo, per estrarre una sottostringa da questa posizione...

Cos'è più veloce: più file di testo con una riga o un file con più righe?

 
Vasiliy Sokolov:

Quindi hanno fatto un errore con CArrayObj. Invece di: CArrayObj test_objects; Hanno scritto: CArrayObj* test_objects, ma hanno dimenticato di fare un distruttore per esso; Forse hanno configurato male il modello di memoria per lavorare con CArrayObj. Forse hanno semplicemente esagerato con i puntatori. La diagnosi è chiara: l'uso di puntatori dove non sono necessari spesso causa perdite.

Ma dove sono necessari? Che senso ha usarli se si possono semplicemente dichiarare degli oggetti?