Biblioteca de clases genéricas - errores, descripción, preguntas, características de uso y sugerencias - página 26
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Se crean copias de objetos en AddValue a través de new, pero no se liberan en el destructor, sólo se borra la lista de punteros.
dice que cuando se llama a un destructor, también se llamará a los destructores de las clases utilizadas
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
No recuerdo ningún caso en el que el terminal no escribiera en el registro una advertencia sobre los objetos no destruidos después de la descarga del script - mi ejemplo no muestra tal advertencia
En segundo lugar, deberías haberlo hecho correctamente con el constructor de copia en lugar del operador de asignación. Pero todo esto es IMHO)
He encontrado información de desarrolladores de que las estructuras o clases simples en MQL se copian siempre sin problemas, lo he comprobado varias veces y parece ser cierto, siempre y cuando utilice las características del lenguaje
De esto se trata la discusión - MQL no es C++, he dejado de buscar analogías entre ellos, si los desarrolladores escribieron que así es como se implementa - lo comprobé, funciona - así que puedes usarlo, si la sintaxis estándar de C++ es crucial, es fácil poner toda la lógica en .dll
Se crean copias de objetos en AddValue a través de new, pero no se liberan en el destructor, sólo se borra la lista de punteros.
¡Oh, Dios! Y cómo se puede borrar una instancia de una clase creada mediante new en el destructor. Intenta hacerlo. No funcionará.
Sólo se puede hacer en el destructor de alguna otra clase.
¡Oh, mierda! Y cómo se puede eliminar una instancia de una clase creada mediante new en el destructor. Puedes probarlo. No funcionará.
Sólo se puede hacer en el destructor de otra clase.
Me refería al destructor de otra clase. Me refería a los elementos creados a través de new en el métodoAddValue
help dice que cuando se llama a un destructor, los destructores de las clases utilizadas también serán llamados
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
No recuerdo un caso en el que el terminal no escribiera una advertencia sobre los objetos no destruidos en el registro después de que se descargara el script - mi ejemplo no muestra tal advertencia
He escuchado de los desarrolladores que las estructuras o clases simples en MQL se copian siempre sin problemas, lo he comprobado varias veces y parece ser cierto, hasta ahora uso las posibilidades del lenguaje
De esto se trata la discusión - MQL no es C++, he dejado de buscar analogías entre ellos, los desarrolladores escribieron que así es como se implementa - lo comprobé, funciona - así que puedes usarlo, si la sintaxis estándar de C++ es crucial, no debería preocuparme poner toda la lógica en .dll.
Sí, lo vi en la ayuda... Algo muy implícito, parece más bien una muleta, en lugar de unique_ptr...
Sí, lo vi en la ayuda... Algo muy implícito, más bien una muleta en lugar de unique_ptr...
Y es tan práctico que ni siquiera puedo llamarlo muleta:
Cree un objeto de cualquier clase, póngalo en una lista de almacenamiento y ya no tendrá que preocuparse de eliminarlo: el subsistema de terminal lo limpia por sí mismo.
Pero también se puede establecer el funcionamiento manual y "ejecutar" para todos los objetos recién creados tratando de rastrear cuándo, dónde y para qué se creó y si se necesita ahora. Si no es necesario, elimínelo. Pero cuando te equivocas, resulta que era necesario: se bloquea al acceder a un puntero no válido...
Así que la muleta no es más que "perseguir objetos" buscando su inutilidad y preocupándose por las fugas de memoria si algún objeto no ha sido atrapado.
En segundo lugar, la forma correcta de hacerlo es a través del constructor de copia, no del operador de asignación. Pero todo esto es IMHO)
¿Puedes darme un ejemplo de cómo copiarlo correctamente para esta plantilla?
He utilizado la ayuda para escribir el método AddValuehttps://www.mql5.com/ru/docs/basis/types/classes
Me he devanado los sesos, pero no veo otra solución en MQL que la que he escrito en mi ejemplo.
Muéstrame tu implementación de un correcto almacenamiento de datos
Y es tan práctico que ni siquiera se le puede llamar muleta:
Cree cualquier objeto de cualquier clase, póngalo en la lista de almacenamiento y ya no tendrá que preocuparse de eliminarlo: el subsistema de terminales lo limpia por sí mismo.
Pero también se puede establecer la operación manual y "ejecutar" para todos los objetos recién creados tratando de averiguar cuándo, dónde y para qué se creó y si se necesita ahora. Si no es necesario, elimínelo. Pero cuando te equivocas, resulta que era necesario: se bloquea al acceder a un puntero no válido...
Así que la muleta no es más que "perseguir objetos" buscando su inutilidad y preocupándose por las fugas de memoria si algún objeto no ha sido atrapado.
El punto aquí es que una vez que agregas un puntero a la colección, también se queda contigo. Eso es lo primero.
help dice que cuando el destructor es llamado, los destructores de las clases utilizadas también serán llamados
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
No recuerdo un caso en el que el terminal no escribiera una advertencia sobre los objetos no destruidos en el registro después de que se descargara el script - mi ejemplo no muestra tal advertencia
He escuchado de los desarrolladores que las estructuras o clases simples en MQL se copian siempre sin problemas, lo he comprobado varias veces y parece ser cierto, hasta ahora uso las posibilidades del lenguaje
De esto se trata la discusión - MQL no es C++, he renunciado a buscar analogías entre ellos, los desarrolladores escribieron que así es como se implementa - lo comprobé, funciona - así que puedes usarlo, si la sintaxis estándar de C++ es crucial, puedes escribir fácilmente toda la lógica en .dll
¿Se puede hacer una matriz triangular con esto?
Debido a las limitaciones del idioma, es poco probable que funcione algo decente. Tengo esta muleta (una envoltura ligera sobre un array estándar).
Para almacenar punteros, escribe un wrapper unic_ptr (aunque no puedes conseguir uno completo, sino auto_ptr al menos). En mi opinión, incluso esta primitiva es mucho más conveniente que las plantillas homólogas de std.