Preguntas de un "tonto" - página 107

 
mql5:
Los destructores en MQL5 son siempre virtuales. Todo se borra correctamente, intenta poner Print(__FUNCSIG__); en los destructores.


Lo hice en VC++, pero creo que los mecanismos de liberación de memoria son los mismos, ¿no?
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
220Volt:
Lo hice en VC++, pero creo que los mecanismos de liberación de memoria son los mismos?
No, en C++ hay que especificar el destructor virtual para eliminar correctamente el objeto mediante delete.

Pero tu ejemplo funcionará correctamente, porque puedes especificar el destructor virtual sólo para la clase base.
 

Intentaré exponer la idea de una manera ligeramente diferente:

Dada:

  • Clase #1 - ocupa 100 bytes en memoria.
  • Clase #2 - es descendiente de la clase #1 y ocupa 200 bytes en memoria.
  • Puntero a la clase nº 1.

Acciones:

  • Escribir en el puntero la dirección de la sección de memoria donde se encuentra una instancia de la clase #2 (llamar a new)
  • Libera el área de soldadura pasando la función de borrado a la dirección almacenada en el puntero.

P.D.: la figura muestra el modelo de memoria )

 
Tengo dudas porque el puntero a la clase número uno, pero en realidad la clase número dos está en la memoria. Sí importa en el caso de los destructores, por lo que me preguntaba si podría haber un problema aquí también. Creo que en esta situación la liberación correcta de memoria puede ocurrir sólo si hay algunas etiquetas en la memoria (como char con terminador nulo) o algo así, por eso pregunté sobre la asignación de memoria.
 
220Volt:
Dudas porque el puntero a la clase número uno y en realidad en la memoria la clase número dos. Sí importa en el caso de los destructores, por lo que me preguntaba si puede haber un problema aquí también. Creo que en tal situación la liberación correcta de la memoria puede ocurrir sólo si hay algunas etiquetas en la memoria (como char con terminador cero) o algo así, por eso pregunté sobre la asignación de memoria.

Tu duda es porque no has especificado los constructores (es importante entender lo que pasa en este caso), intenta ejecutar este ejemplo y lo entenderás todo:

class CFoo
  {
public:
                     CFoo() { Print(__FUNCSIG__); }
                    ~CFoo() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CBar : public CFoo
  {
public:
                     CBar() { Print(__FUNCSIG__); }
                    ~CBar() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   CFoo *f=new CBar();

   delete f;
  }
//+------------------------------------------------------------------+

HZ tanto la construcción en sí como el borrado se escalonan, y toda esta información se almacena (el propio puntero virtual recuerda que la clase se construyó como un compuesto a partir de la base y la descendiente), y al borrar se llaman los destructores en orden inverso, desde el posterior al anterior.

 
No se trata de los destructores, sino de la propia clase, y más concretamente de cuántos bytes ocupa. Resulta que asignamos 200 bytes, y luego me dicen que libere la memoria, que está apuntada por un puntero que representa un objeto de tamaño 100 bytes.
 
220Volt:
No se trata de los destructores, sino de la propia clase, y más concretamente de cuántos bytes ocupa. Resulta que asignamos 200 bytes y luego me dicen que libere la memoria apuntada por el puntero que representa el objeto con el tamaño de 100 bytes.
Supongo que tu pregunta está relacionada con el funcionamiento del pool de memoria.
Sí, el pool de memoria sabe cuánto tiempo se liberará un trozo de memoria mediante una llamada de borrado.
El lugar donde se almacena esta información depende de la implementación del pool.

Por ejemplo, si das un puntero a un objeto en C++ que no se asigna a través de new, verás cómo tu aplicación se bloquea.
 
220Volt:
No se trata de los destructores, sino de la propia clase, y más concretamente de cuántos bytes ocupa. Resulta que asignamos 200 bytes y luego me dicen que libere la memoria apuntada por el puntero que representa el objeto con el tamaño de 100 bytes.
Supongo que no has analizado mi muestra. Si no, no habrías hecho esas preguntas.
 
Estaba pensando, recordé que se puede asignar memoria para un array de int's por ejemplo y luego borrarlos todos, a pesar de que un int es pequeño, probablemente lo mismo con las clases. Gracias por las respuestas.
 
mql5:
Entiendo que tu pregunta tiene que ver con el funcionamiento del pool de memoria.
Sí, el pool de memoria sabe cuánto tiempo se liberará una pieza por una llamada de borrado.
El lugar donde se almacena esta información depende de la implementación del pool.

Por ejemplo, si le das un puntero a un objeto en C++ que no fue asignado a través de new, verás como tu aplicación se bloqueará.
Eso es todo, gracias.