Domande su OOP in MQL5 - pagina 4

 
Dmitry Fedoseev:
Il puntatore può anche essere passato per non riferimento - senza &.
Sì, è possibile. Ma se passiamo un puntatore senza &, viene creato un nuovo puntatore sullo stack a cui viene assegnato il valore passato. Inoltre, se si alloca la memoria con questo puntatore in una funzione, è il puntatore creato sullo stack che cambia, il che significa che si hanno perdite di memoria quando si srotola lo stack. Certo, non è bene farlo, ma se uno vuole...
 
Vladimir Simakov:
Se i distruttori vengono chiamati in questo modo, il puntatore creato sullo stack viene cambiato e, di conseguenza, si ottengono perdite di memoria quando lo stack viene "srotolato". Naturalmente, non è bene farlo, ma se uno vuole...

il comportamento dei puntatori alle classi in MQL non è prevedibile, uno degli amministratori una volta ha scritto che tutte le classi sono create nella memoria globale (allocazione di memoria), tu scrivi che i puntatori alle classi nello scope locale sono creati nello stack (imho, dovrebbe essere così!)

Anche se potrei confondere qualcosa, forse controllerò - in teoria non è difficile da controllare, è sufficiente registrare Print() nel distruttore della classe di test, i distruttori devono essere chiamati automaticamente quando si lascia l'ambito locale...

 
Vladimir Simakov:
Sì, possono. Solo se si passa un puntatore senza &, viene creato un nuovo puntatore sullo stack a cui viene assegnato il valore passato. E se allarghiamo la memoria con questo puntatore in una funzione, è il puntatore creato sullo stack che cambia, quindi abbiamo una perdita di memoria quando srotoliamo lo stack. Certo, non è bene farlo, ma se uno vuole...

Non ci saranno perdite. Perché nessuno alloca nulla a questo puntatore nella funzione.

 
Igor Makanu:

il comportamento dei puntatori alle classi in MQL non è prevedibile, uno degli amministratori una volta ha scritto che tutte le classi sono create nella memoria globale (allocazione di memoria), tu scrivi che i puntatori alle classi nello scope locale sono creati nello stack (imho, dovrebbe essere così!)

Anche se potrei essere confuso da qualcosa, forse lo controllerò - in teoria non è difficile da controllare, devi solo registrare Print() nel distruttore della classe di test, i distruttori devono essere chiamati automaticamente quando si lascia l'ambito locale...

Se la memoria viene allocata dinamicamente (new), viene allocata nell'heap e se si crea un oggetto sullo stack (CObj obj;), anche la memoria viene allocata sullo stack.

 
Dmitry Fedoseev:

Non ci saranno perdite. Perché nessuno alloca nulla a questo puntatore nella funzione.

void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Questa è una classica perdita. Al puntatore creato sullo stack e inizializzato al momento della creazione con il valore passato nella funzione è stato assegnato un nuovo valore ed è diventato il puntatore a un nuovo oggetto. Dopo di che, il puntatore è stato ucciso in modo sicuro quando lo stack viene dispiegato. Che è esattamente quello che avevamo bisogno di provare. Questo è esattamente dove dovrebbe essere:

void CreateLabel(CChartObjectLabel* &l,string name,int y)
 
Vladimir Simakov:

Se la memoria viene allocata dinamicamente (new), viene allocata nell'heap, e se si crea un oggetto sullo stack (CObj obj;), anche la memoria gli viene allocata sullo stack.

In mql non esiste una cosa del genere - (CObj obj;).

 
Vladimir Simakov:

Una classica perdita. Un puntatore creato sullo stack e inizializzato alla creazione con il valore passato nella funzione veniva assegnato un nuovo valore e diventava un puntatore a un nuovo oggetto. Dopo di che, il puntatore è stato ucciso in modo sicuro quando lo stack è stato dispiegato. Che è esattamente quello che avevamo bisogno di provare. Questo è esattamente dove dovrebbe essere:

Non confondere il dono di Dio con un uovo. Una ragione in più per scrivere codice idiota per dimostrare un'affermazione errata...

 
Dmitry Fedoseev:

Nessuna cosa del genere in mql - (CObj obj;)

Dai, lo uso sempre.
 
Vladimir Simakov:
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Una classica perdita. Un puntatore creato sullo stack e inizializzato alla creazione con il valore passato nella funzione veniva assegnato un nuovo valore e diventava un puntatore a un nuovo oggetto. Dopo di che, il puntatore è stato ucciso in modo sicuro quando lo stack è stato dispiegato. Che è esattamente quello che avevamo bisogno di provare. Questo è esattamente dove dovrebbe essere:

Perché si dovrebbe intenzionalmente riassegnare un puntatore passato a una funzione? Naturalmente, ci sarà una perdita. Ma questo non è un "classico leak", ma un classico errore di lavorare con un puntatore a un oggetto.

Non dovete creare un nuovo oggetto qui, ma gestire l'oggetto esterno il cui puntatore è stato passato nella funzione.

 
Vladimir Simakov:
Dai, lo uso sempre.

Dove e come?

Motivazione: