Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 598

 
Juer:

Você pode me dizer se estou criando um objeto CArrayObj e adicionando outros objetos a ele? Eu ainda preciso dos próprios objetos. E eu posso apagar este objeto da lista.

Que método devo usar para remover objetos dele antes de apagar? Destacar() ou Eliminar()?

Ou Clear() / Shutdown() ?

A confusão é porque você não entende como a memória é alocada e como ela deve ser tratada. Em geral, nem o CArrayObj nem os objetos nele localizados, Não há necessidade de apagar 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;
}
 

Eu passo um objeto para a função de classe, uma referência a ela, para que as ações na função aconteçam com ela, e então ele será devolvido. Mas não preciso mais do objeto de classe em si... Então, como posso apagá-lo?

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;
  }

Assim. Quando apago a classe de teste, diz ponteiro Inválido na próxima iteração.

Como posso apagar a classe de teste sem apagar o objeto passado para ela?

 
Vasiliy Sokolov:

Você está confuso porque não entende como a memória é alocada e como ela deve ser tratada. No caso geral, nem CArrayObj nem objetos dentro dele , não há necessidade de apagar manualmente.

Bem, se eu criei um conjunto de objetos. Ou seja, eu criei um objeto array ArrayObj, realizei as ações necessárias com ele. Então eu não preciso deste objeto, mas preciso dos próprios objetos dentro dele (membros da matriz), não deveria eu apagar este objeto da matriz?

 

Este vv Ihor Herasko vai chegar ao fim de semana, e não está lá ; )

questões estão pendentes desde a última quinta-feira! : )

sou responsável por minhas revisões afinal, e dei uma boa revisão, seja gentil, termine seu jogo a la "respondo 1 pergunta por dia", porque não estou entusiasmado em esperar, e não quero realmente revisar minha revisão. a este ritmo terei que esperar toda a próxima semana, e preciso dar a coruja a um freelancer para revisão ; )
 
Juer:

Eu passo um objeto para a função de classe, uma referência a ela, para que as ações na função aconteçam com ela, e então ele será devolvido. Mas não preciso mais do objeto de classe em si... Então, como posso apagá-lo?

Assim. Quando apago a classe de teste, diz ponteiro Inválido na próxima iteração.

Como apagar a classe de teste sem apagar o objeto passado para ela?

É preciso evitar a criação de ponteiros para os objetos. Em vez disso, trabalhar com objetos diretamente sobre a pilha da função:

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;
  }

Uma vez que o test_object tem a garantia de conter CTestObjects (você não adicionou nada além destes objetos, certo?:) Então você pode simplificar o código removendo a verificação 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);   
  }

E apenas brevemente:

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

Bem, se eu criei um conjunto de objetos. Ou seja, eu criei um objeto array ArrayObj, realizei as ações necessárias com ele. Então eu não preciso deste objeto, mas preciso dos objetos em si (membros da matriz), não deveria eu apagar este objeto da matriz?

Você não entende o propósito do CArrayObj. É o proprietário dos objetos que você coloca nele. Se você remover o CArrayObj, os objetos que você colocar nele também serão removidos. Como o ArrayObj é o proprietário desses objetos, ele também é seu gerente - ele controla as referências aos objetos e elimina automaticamente toda a memória alocada quando a coleção não é mais necessária. Portanto, você não precisa liberar nada e usar o operador de eliminação. Tudo é feito pelo próprio CArrayObj. O próprio CArrayObj não leva quase nenhuma memória no computador (algumas dezenas de bytes), por isso é inútil tentar apagá-lo.

 
Vasiliy Sokolov:

Você não entende o objetivo do CArrayObj. É o proprietário dos objetos que você coloca nele. Se você remover o CArrayObj, então os objetos que você colocar nele também serão removidos. Como o ArrayObj é o proprietário desses objetos, ele também é seu gerente - ele controla as referências aos objetos e elimina automaticamente toda a memória alocada quando a coleção não é mais necessária. Portanto, você não precisa liberar nada e usar o operador de eliminação. Tudo é feito pelo próprio CArrayObj. O próprio CArrayObj não leva quase nenhuma memória no computador (algumas dezenas de bytes), portanto não adianta tentar apagá-lo.

Mas então erros de objetos não apagados CArrayObj

 
Juer:

Mas então erros de objetos não apagados CArrayObj

Então, eles cometeram um erro com o CArrayObj. Eles escreveram CArrayObj* test_objects em vez de CArrayObj, mas esqueceram de fazer um construtor para ele; talvez tenham configurado mal o modelo de memória para lidar com o CArrayObj. Talvez eles simplesmente o tenham exagerado com indicações. O diagnóstico é claro: o uso de indicadores onde eles não são necessários muitas vezes causa vazamentos.

 

Olá!

Você pode me dizer como mover o cursor para, digamos, a linha 7 em um documento de texto, para extrair um substrato desta posição...

O que é mais rápido - vários arquivos de texto com uma linha ou um arquivo com mais linhas?

 
Vasiliy Sokolov:

Então, eles cometeram um erro com o CArrayObj. Ao invés de: CArrayObj test_objects; Eles escreveram: CArrayObj* test_objects, mas esqueceram de fazer um destruidor para ele; Talvez tenham configurado incorretamente o modelo de memória para trabalhar com o CArrayObj. Talvez os programadores simplesmente o exageraram com indicações. O diagnóstico é claro: o uso de indicadores onde eles não são necessários muitas vezes causa vazamentos.

Mas onde eles são necessários? De que adianta usá-los se você pode simplesmente declarar objetos?