Preguntas de un "tonto" - página 106

 
uncleVic:
Tarea... Por favor, adjunte un módulo de señales (no tengo ninguno). Echemos un vistazo.
Archivos adjuntos:
 
openlive:

Es aún más extraño. El efecto no se produce para mí.
 
uncleVic:

Más raro aún. No entiendo el efecto.

efecto sólo durante la inicialización, en el probador todo es normal

Vale, no lo necesito, no lo necesito realmente.

 

El indicador Zigzag lee valores que ya no existen (debían estar ahí antes de redibujar), ¿se puede evitar?

Si los valores están en el buffer, ¿por qué no se dibuja de nuevo...

 

Buenas tardes, por favor explique lo siguiente:

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

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

Tengo dos clases, creo que la instancia de la siguiente generación (base - child - child2 - ...), ocupa cada vez más espacio en la memoria. Al operador New, le decimos exactamente cuánta memoria debe asignar, pasándole la clase en parámetros. Pero en el operador de borrado, no decimos exactamente cuánta memoria hay que asignar. Partiendo de este razonamiento, no está del todo claro qué ocurrirá en la siguiente situación:

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

Es decir, declaramos *pClass como un puntero a Cbase (una clase pequeña comparada con Cchild), pero en realidad apunta a Cchild. De ahí la pregunta, ¿cómo se comportarádelete()? ¿Liberará el número de bytes igual al tamaño de Cbase (entonces la memoria se atascará), o el borrado se producirá correctamente?

P.D: bueno, una pregunta más sobre el tema: ¿hay alguna etiqueta en el área de memoria asignada (nueva), con la que podamos entender el tamaño de esta área (algo así como que el char se almacena con el terminador cero al final)? O, en otras palabras, ¿puede un trozo de código que no sabe nada sobre los tamaños de las clases que he declarado liberar memoria correctamente?

 

220Volt:

La pregunta es, ¿cómo se comportarádelete()? ¿Liberará un número de bytes igual al tamaño de la Cbase (entonces la memoria se obstruirá), o el borrado se producirá correctamente?

Por supuesto, liberará la memoria correctamente.

P.D: bueno, una pregunta más sobre el tema: ¿hay alguna etiqueta en el área de memoria asignada (nueva), con la que se pueda entender el tamaño de esta área (algo así como la forma en que se almacena el char con terminador cero al final)? O, en otras palabras, ¿puede un fragmento de código que no sabe nada sobre los tamaños de las clases que he declarado liberar correctamente la memoria?

¿tamaño?
 
sergeev:

por supuesto que se borrará correctamente. puedes repartir los puntos de ladrillo en los destructores

De ahí viene esta pregunta. Hizo más o menos lo descrito (el destructor no era virtual), y los destructores por debajo de la clase de puntero no fueron llamados.
 
sergeev:
¿tamaño?
Creo que sizeof funciona en tiempo de compilación, pero me refiero a liberar memoria de otro proceso por ejemplo. Si esto es posible, entonces creo que la función de borrado sería comprensible.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
Los destructores en MQL5 son siempre virtuales. Todo se borra correctamente, intenta poner Print(__FUNCSIG__); en los destructores.

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

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

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
La pregunta no es más sobre lo que hemos establecido en las funciones de la clase a través de new, sino sobre los datos de la clase de sus miembros "nativos". Al fin y al cabo, tampoco son espacios vacíos.