Errores, fallos, preguntas - página 1785

 
fxsaber:
Sé para qué sirve el destructor. No me queda claro por qué la palabra virtual debe escribirse antes de su definición.
Lo necesito para la compatibilidad del código con C++, porque los destructores son diferentes allí
 
A100:
Lo necesito para la compatibilidad del código con C++, porque los destructores son diferentes allí
Entendido, gracias. ¿Produces mucho a MQL5? - ¿Por eso los ejemplos son tan específicos?
 
fxsaber:
Sé para qué sirve el destructor. No entiendo por qué hay que añadir la palabra virtual antes de su definición.

Funciones virtuales y destructor >>>

La regla básica: si tienes al menos una función virtual en tu clase, el destructor también debe ser virtual. Recuerda que el destructor no es virtual por defecto, por lo que debes declararlo explícitamente. Si no lo haces, es casi seguro que tendrás fugas de memoria en tu programa. Una vez más, no hace falta ser muy inteligente para entender por qué. Veamos varios ejemplos.

 
fxsaber:
Lo tengo, gracias. ¿Produces mucho a MQL5? - ¿Por eso los ejemplos son tan específicos?
No hago muchos puertos. Específicos sólo a primera vista. Algunos "expertos" escribieron aquí que más de 3 clases de derivados es perjudicial. A menudo sólo tengo 3-4 clases base que necesitan una inicialización adecuada y sólo entonces vienen los verdaderos derivados.
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

Esta vez el objeto se construye como debería, pero cuando se destruye, se produce una fuga de memoria, porque no se llama al destructor de la clase derivada.

La razón es que la eliminación se realiza a través de un puntero a una clase base y el compilador utiliza la vinculación temprana para llamar al destructor. El destructor de la clase base no puede llamar al destructor de la clase derivada porque no sabe nada de ella. Como resultado, parte de la memoria asignada para la clase derivada se pierde irremediablemente.

Para evitar esto, el destructor en la clase base debe ser declarado como virtual.

No entiendo arquitectónicamente por qué, al hacer virtual el destructor base, aparece información sobre el destructor derivado.

Ahora entiendo que cuando la base es virtual, entonces al definir un destructor derivado estamos sustituyendo el destructor base por uno derivado. Pero entonces el destructor base no debería ser llamado en este ejemplo.

Obviamente, no entiendo cómo funciona esto. Nunca he tenido problemas con las funciones virtuales en MQL5. Me gusta mucho la OOP por ellos. Pensé que lo había entendido todo. Ahora tengo un completo dilema. Por favor, explíquemelo en sus propios términos.

 
A100:
Retratando poco. Específicos sólo a primera vista. Algunos "expertos" escribieron aquí que TODO lo que sea más de 3 clases derivadas es perjudicial. A menudo sólo tengo 3-4 clases base para inicializar correctamente y sólo entonces comienzan los verdaderos derivados
Me gustaría ver un ejemplo de cómo escriben los profesionales (desde mi punto de vista) en MQL5.
 
fxsaber:

Pero entonces el destructor base no debería ser llamado en este ejemplo.

Es llamado por el destructor derivado implícitamente. En realidad, esto es lo que lo diferencia de las simples funciones virtuales.
 
Комбинатор:
Es llamado por el destructor derivado implícitamente. En realidad, eso es lo que lo diferencia de las simples funciones virtuales.
Gracias. Resulta que el destructor virtual no es sólo una función virtual que se llama mientras se destruye el objeto, sino una entidad más complicada.
 
fxsaber:
Bueno, él tiene que borrar el objeto) esa es la parte complicada
 
Alexey Kozitsyn:

Error de SymbolInfoTick() que devuelve datos irrelevantes - rebasamiento de ticks. Compilación 1525 x64. Prueba desde el indicador, no probó en el Asesor Experto:

Real, Apertura, Servidor de Acceso V. ¡Tristeza! Presta atención al problema, por favor. Y también al problema en la solicitud#1598238 (a partir de la página 10, post de2017.01.26 09:43).

Queridos desarrolladores, ¡arreglemos los ticks! ¡Código proporcionado, aquí está - el problema, no hay necesidad de buscar nada, sólo reaccionar y solucionarlo!

Si sustituimos OnCalculate por OnTick, no se produce ningún error. El problema no está en SymbolInfoTick, el problema es que los indicadores están configurados torcidamente para no saltar.