Domande da un "manichino" - pagina 106

 
uncleVic:
Compito... Si prega di allegare un modulo di segnalazione (non ne ho uno). Diamo un'occhiata.
File:
 
openlive:

È ancora più strano. L'effetto non si manifesta per me.
 
uncleVic:

Ancora più strano. Non capisco l'effetto.

effetto solo durante l'inizializzazione, nel tester tutto è normale

Ok, non ne ho bisogno, non ne ho davvero bisogno.

 

L'indicatore Zigzag legge valori che non esistono più (dovevano esserci prima del ridisegno). Si può evitare questo?

Se i valori sono nel buffer, perché non sta disegnando di nuovo...

 

Buon pomeriggio, per favore spiegate quanto segue:

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

Ho due classi, credo che l'istanza di generazione successiva (base - bambino - bambino2 - ...), prenda sempre più spazio in memoria. All'operatore New, diciamo esattamente quanta memoria allocare, passando la classe in parametri. Ma nell'operatore di cancellazione, non diciamo esattamente quanta memoria allocare. Procedendo da questo ragionamento, non è del tutto chiaro cosa succederà nella prossima situazione:

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

Voglio dire che abbiamo dichiarato *pClass come puntatore a Cbase (una classe piccola rispetto a Cchild), ma in realtà punta a Cchild. Da qui la domanda: come si comporteràdelete()? Libererà un numero di byte pari alla dimensione di Cbase (quindi la memoria sarà intasata), o la cancellazione avverrà correttamente?

P.S: bene, un'altra domanda sull'argomento: c'è qualche etichetta nell'area di memoria allocata (nuova), con cui possiamo capire la dimensione di quest'area (qualcosa come char memorizzato con null-terminator alla fine)? O in altre parole, un pezzo di codice che non sa nulla delle dimensioni delle classi che ho dichiarato può liberare correttamente la memoria?

 

220Volt:

La domanda è: come si comporteràdelete()? Libererà un numero di byte pari alla dimensione di Cbase (quindi la memoria sarà intasata), o la cancellazione avverrà correttamente?

Naturalmente, libererà la memoria correttamente.

P.S: bene, un'altra domanda sull'argomento: c'è qualche etichetta nell'area di memoria allocata (nuova), con cui possiamo capire la dimensione di quest'area (qualcosa come char memorizzati con terminatore zero alla fine)? O in altre parole, un frammento di codice che non sa nulla delle dimensioni delle classi che ho dichiarato può liberare correttamente la memoria?

dimensione di ?
 
sergeev:

Naturalmente si cancellerà correttamente. potete distribuire i brickpoint sui distruttori

Questo è più o meno il punto di partenza di questa domanda. L'ho fatto più o meno come descritto (il distruttore non era virtuale), e i distruttori sotto la classe del puntatore non sono stati chiamati.
 
sergeev:
dimensione di ?
Penso che sizeof funzioni a tempo di compilazione, ma sto parlando di liberare la memoria da un altro processo per esempio. Se questo è possibile, allora penso che la funzione di cancellazione sia comprensibile.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
I distruttori in MQL5 sono sempre virtuali. Tutto è cancellato correttamente, provate a mettere Print(__FUNCSIG__); nei distruttori.

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
La questione non è nemmeno più su ciò che abbiamo impostato nelle funzioni di classe tramite new, ma sui dati di classe dei suoi membri "nativi". Dopo tutto, non sono nemmeno spazi vuoti.
Motivazione: