Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 598

 
Juer:

¿Puedes decirme si estoy creando un objeto CArrayObj y añadiendo otros objetos a él? Todavía necesito los objetos en sí. Y puedo eliminar este objeto de la lista.

¿Qué método debo utilizar para eliminar los objetos del mismo antes de borrarlo? ¿Descargar() o eliminar()?

¿O Clear() / Shutdown() ?

La confusión se debe a que no entiendes cómo se asigna la memoria y cómo debe manejarse. En el caso general ni CArrayObj ni los objetos ubicados en él, No es necesario eliminar manualmente.

// Где-то в коде есть объект CArrayObj
CArrayObj ArrayOfItems;
...
//Где-то в коде заполнили коллекцию пользовательскими объектами
void Create()
{
  ArrayOfItems.Add(new CUserItem());
  ArrayOfItems.Add(new CUserItem());
  //...
  ArrayOfItems.Add(new CUserItem());
}
// Так не правильно делать. Удалять ничего не надо.
void OnDeinit(const int reason)
{
   delete ArrayOfItems;
}
 

Paso un objeto a la función de la clase, una referencia a ella, para que las acciones de la función le sucedan, y luego sea devuelto. Pero ya no necesito el objeto de clase en sí... Entonces, ¿cómo lo borro?

for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=test_objects.At(i);
   if(!CheckPointer(test_object)
        continue;
   CTestClass *test_class=new CTestClass();
   if(test_class.Check(test_object))
        res=true;
   delete test_class;
  }

Así. Cuando borro test_class, dice Puntero inválido en la siguiente iteración...

¿Cómo puedo eliminar test_class sin borrar el objeto que se le ha pasado?

 
Vasiliy Sokolov:

Estás confundido porque no entiendes cómo se asigna la memoria y cómo se debe manejar. En el caso general, ni CArrayObj ni los objetos dentro de él , no es necesario borrar manualmente.

Bien, si he creado un array de objetos. Es decir, he creado un objeto array ArrayObj, he realizado las acciones necesarias con él. Entonces no necesito este objeto, sino que necesito los propios objetos dentro de él (miembros del array), ¿no debería eliminar este objeto del array?

 

Este vv Ihor Herasko llegará al fin de semana, y no está allí ; )

¡las preguntas están pendientes desde el jueves pasado! : )

al fin y al cabo soy responsable de mis críticas, y te he hecho una buena crítica, sé amable y termina tu juego a la "respondo 1 pregunta al día", porque no me entusiasma la espera, y no me apetece mucho corregir mi crítica. a este paso tendré que esperar toda la semana que viene, y tengo que darle el búho a un autónomo para que lo revise ; )
 
Juer:

Paso un objeto a la función de la clase, una referencia a él, para que las acciones de la función le sucedan, y luego sea devuelto. Pero ya no necesito el objeto de clase en sí... Entonces, ¿cómo lo borro?

Así. Cuando borro test_class, dice Puntero inválido en la siguiente iteración...

¿Cómo puedo eliminar test_class sin borrar el objeto que se le ha pasado?

Hay que evitar crear punteros a objetos. Trabajar con objetos directamente en la pila de funciones en su lugar:

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=dynamic_cast<CTestObject*>(test_objects.At(i));
   if(test_object == NULL)
        continue;
   if(test_class.Check(test_object))
        res=true;
  }

Dado que test_object está garantizado para contener CTestObjects (no has añadido nada más que estos objetos, ¿verdad?:) Entonces puedes simplificar el código eliminando la comprobación fantasma:

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   CTestObject *test_object = test_objects.At(i);
   bool res = test_class.Check(test_object);   
  }

Y sólo brevemente:

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
   bool res = test_class.Check((CTestObject)test_objects.At(i));
 
Juer:

Bien, si he creado un array de objetos. Es decir, he creado un objeto array ArrayObj, he realizado las acciones necesarias con él. Entonces no necesito este objeto, sino que necesito los propios objetos que hay dentro (miembros del array), ¿no debería borrar este objeto del array?

No entiendes el propósito de CArrayObj. Es el propietario de los objetos que colocas en él. Si eliminas CArrayObj, los objetos que pongas en él también se eliminarán. Dado que ArrayObj es el propietario de estos objetos, también es su gestor: controla las referencias a los objetos y borra automáticamente toda la memoria asignada cuando la colección ya no es necesaria. Así que no es necesario liberar nada y utilizar el operador de borrado. Todo lo hace el propio CArrayObj. El CArrayObj en sí no ocupa casi nada de memoria en el ordenador (unas decenas de bytes), por lo que no tiene sentido intentar borrarlo.

 
Vasiliy Sokolov:

No entiendes el propósito de CArrayObj. Es el propietario de los objetos que colocas en él. Si eliminas CArrayObj, también se eliminarán los objetos que hayas introducido en él. Dado que ArrayObj es el propietario de estos objetos, también es su gestor: controla las referencias a los objetos y borra automáticamente toda la memoria asignada cuando la colección ya no es necesaria. Así que no es necesario liberar nada y utilizar el operador de borrado. Todo lo hace el propio CArrayObj. El CArrayObj en sí no ocupa casi nada de memoria en el ordenador (unas decenas de bytes), por lo que no tiene sentido intentar borrarlo.

Pero entonces los errores de los objetos no borrados CArrayObj

 
Juer:

Pero entonces los errores de los objetos no borrados CArrayObj

Así que cometieron un error con CArrayObj. Han escrito CArrayObj* test_objects en lugar de CArrayObj, pero se han olvidado de hacer un constructor para ello; quizás han configurado mal el modelo de memoria para manejar CArrayObj. Quizás los programadores simplemente se excedieron con los punteros. El diagnóstico es claro: el uso de punteros donde no son necesarios suele provocar fugas.

 

¡Hola!

Me puedes decir cómo mover el cursor a, por ejemplo, la línea 7 de un documento de texto, para extraer una subcadena de esta posición...

¿Qué es más rápido: varios archivos de texto con una línea o un archivo con más líneas?

 
Vasiliy Sokolov:

Así que cometieron un error con CArrayObj. En lugar de: CArrayObj test_objects ; Escribieron: CArrayObj* test_objects, pero se olvidaron de hacer un destructor para él; Tal vez configuraron incorrectamente el modelo de memoria para trabajar con CArrayObj. Quizás los programadores simplemente se excedieron con los punteros. El diagnóstico es claro: el uso de punteros donde no son necesarios suele provocar fugas.

Pero, ¿dónde se necesitan en absoluto? ¿Qué sentido tiene utilizarlas si se pueden declarar objetos sin más?