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:
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á.
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?
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:
Acciones:
P.D.: la figura muestra el modelo de memoria )
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:
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 apuntada por el puntero que representa el objeto con el tamaño de 100 bytes.
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.
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.
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á.