Preguntas sobre POO en MQL5 - página 4

 
Dmitry Fedoseev:
El puntero también se puede pasar por no-referencia - sin &.
Sí, puedes hacerlo. Pero si pasamos un puntero sin &, se crea un nuevo puntero en la pila al que se asigna el valor pasado. Además, si asignamos memoria mediante este puntero en una función, es el puntero creado en la pila el que cambia, lo que significa que obtenemos una fuga de memoria al desenrollar la pila. Por supuesto, no es bueno hacer eso, pero si uno quiere...
 
Vladimir Simakov:
Si se llama a los destructores de esta manera, el puntero creado en la pila se modificará y, en consecuencia, obtendremos fugas de memoria cuando se "desenrolle" la pila. Por supuesto, no es bueno hacer eso, pero si uno quiere...

el comportamiento de los punteros a las clases en MQL no es predecible, uno de los administradores escribió una vez que todas las clases se crean en la memoria global (asignación de memoria), usted escribe que los punteros a las clases en el ámbito local se crean en la pila (imho, debe ser así!)

Aunque puede que me confunda en algo, tal vez lo compruebe - en teoría no es difícil de comprobar, sólo hay que registrar Print() en el destructor de la clase de prueba, los destructores deben ser llamados automáticamente al salir del ámbito local...

 
Vladimir Simakov:
Sí, pueden hacerlo. Sólo si pasamos un puntero sin &, se crea un nuevo puntero en la pila al que se asigna el valor pasado. Y si asignamos memoria por este puntero en una función, es el puntero creado en la pila el que cambia, por lo que se produce una fuga de memoria al desenrollar la pila. Por supuesto, no es bueno hacer eso, pero si uno quiere...

No habrá fugas. Porque nadie está asignando nada a este puntero en la función.

 
Igor Makanu:

el comportamiento de los punteros a las clases en MQL no es predecible, uno de los administradores escribió una vez que todas las clases se crean en la memoria global (asignación de memoria), usted escribe que los punteros a las clases en el ámbito local se crean en la pila (imho, debe ser así!)

Aunque puede que me confunda en algo, tal vez lo compruebe - en teoría no es difícil de comprobar, sólo hay que registrar Print() en el destructor de la clase de prueba, los destructores deben ser llamados automáticamente al salir del ámbito local...

Si la memoria se asigna dinámicamente (new), se asigna en el heap y si se crea un objeto en la pila (CObj obj;), se le asigna memoria también en la pila.

 
Dmitry Fedoseev:

No habrá fugas. Porque nadie asigna nada a este puntero en la función.

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

Esta es una fuga clásica. Al puntero creado en la pila e inicializado al ser creado con el valor pasado a la función se le asignó un nuevo valor y se convirtió en el puntero a un nuevo objeto. Después de eso, el puntero se mató de forma segura cuando la pila se despliega. Que es exactamente lo que necesitábamos probar. Aquí es exactamente donde debería estar:

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

Si la memoria se asigna dinámicamente (new), se asigna en el heap, y si se crea un objeto en la pila (CObj obj;), también se le asigna memoria en la pila.

En mql no existe tal cosa - (CObj obj;).

 
Vladimir Simakov:

Una fuga clásica. A un puntero creado en la pila e inicializado en la creación con el valor pasado a la función se le asignó un nuevo valor y se convirtió en un puntero a un nuevo objeto. Después de eso, el puntero fue eliminado de forma segura cuando se desplegó la pila. Que es exactamente lo que necesitábamos probar. Aquí es exactamente donde debería estar:

No confundas el regalo de Dios con un huevo. Razón de más para escribir código idiota para demostrar una afirmación errónea...

 
Dmitry Fedoseev:

No existe en mql - (CObj obj;)

¡Vamos! Lo uso todo el tiempo.
 
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 fuga clásica. A un puntero creado en la pila e inicializado en la creación con el valor pasado a la función se le asignó un nuevo valor y se convirtió en un puntero a un nuevo objeto. Después de eso, el puntero fue eliminado de forma segura cuando se desplegó la pila. Que es exactamente lo que necesitábamos probar. Aquí es exactamente donde debería estar:

¿Por qué reasignar intencionadamente un puntero pasado a una función? Por supuesto, habrá una fuga. Pero no se trata de una "fuga clásica", sino de un error clásico de manejo de un puntero a un objeto.

Aquí no hay que crear un nuevo objeto, sino manejar el objeto externo cuyo puntero se pasó a la función.

 
Vladimir Simakov:
¡Vamos! Lo uso todo el tiempo.

¿Dónde? ¿Dónde y cómo?