4 undeleted objects left

Nikolai Karetnikov  

Всем доброго здоровья! 

Приведенный код удаляет дубликаты из коллекции


#include <Arrays\ArrayObj.mqh>

class CPositionAgent;
class CPositionCollection : public CArrayObj
{
public:
CPositionAgent  *operator[](const int inIndex) const { return (CPositionAgent*)At(inIndex);}

int CPositionCollection::doUnique(void)
{
   CPositionAgent *lPA0, *lPAi;
   lPA0 = this[0];
 
  for(int i=1;i<this.m_data_total;i++)
     {
      lPAi = new CPositionAgent();
      lPAi = this[i];
      if(this.count(this[i])>1)
      {
         delete this[i];
         this.Detach(i);
      }
     }
   return(this.m_data_total);
}

private:
int count(CPositionAgent *inPA)
{
   int lC=0;
   for(int i=0;i<this.Total();i++)
     {
      if(inPA.Compare(this[i],1)==0)
        {
         lC++;
        }
     }
   return(lC);
}

};

class CPositionAgent : public CObject
{
public:

   ulong             meTicket;
   void CPositionAgent::CPositionAgent(ulong inTicket){this.meTicket=inTicket;return;}
   void CPositionAgent::CPositionAgent(){return;}
   int CPositionAgent::Compare(const CObject *node,const int mode=0)const override
   {
   CPositionAgent *inNode = (CPositionAgent*)node;
   if( this.meTicket == inNode.meTicket ) 
      {return(0);
      }
   if( this.meTicket > inNode.meTicket )
     {
      return(1);
     }
   else
     {
      return(-1);
     }
   }
};

void OnStart()
{
 CPositionCollection lCollOfPosAgents;
   
   lCollOfPosAgents.Add(new CPositionAgent(1));
   lCollOfPosAgents.Add(new CPositionAgent(1));
   lCollOfPosAgents.Add(new CPositionAgent(3));
   lCollOfPosAgents.Add(new CPositionAgent(2));   
   lCollOfPosAgents.Add(new CPositionAgent(2));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   
   lCollOfPosAgents.doUnique();
   
   for(int i=0;i<lCollOfPosAgents.Total();i++)
   {
      Print(lCollOfPosAgents[i].meTicket);
   }
}

После окончания на вкладке Experts вижу сообщение о четырех оставшихся в живых объектах

Те самые дубликаты, которые я принудительно удаляю 

if(this.count(this[i])>1)
      {
         delete this[i];
         this.Detach(i);
      }

Хотелось бы понять, как так-то? ))

Maxim Kuznetsov  
Nikolai Karetnikov:

Всем доброго здоровья! 

Приведенный код удаляет дубликаты из коллекции


После окончания на вкладке Experts вижу сообщение о четырех оставшихся в живых объектах

Те самые дубликаты, которые я принудительно удаляю 

Хотелось бы понять, как так-то? ))

или кто укурился с перегрузкой оператора =

или вот тут течёт:

      lPAi = new CPositionAgent();
      lPAi = this[i];
Nikolai Karetnikov  
Maxim Kuznetsov:

или кто укурился с перегрузкой оператора =

или вот тут течёт:


)))))

Спасибо!

Nikolai Karetnikov  
Nikolai Karetnikov:


)))))

Спасибо!

в коде закрался баг 

#include <Arrays\ArrayObj.mqh>

class CPositionAgent;
class CPositionCollection : public CArrayObj
{
public:
CPositionAgent  *operator[](const int inIndex) const { return (CPositionAgent*)At(inIndex);}

int CPositionCollection::doUnique(void)
{
   CPositionAgent *lPA0, *lPAi;
   lPA0 = this[0];
 
  for(int i=1;i<this.m_data_total;i++)
     {
      lPAi = new CPositionAgent();
      lPAi = this[i];
      if(this.count(this[i])>1)
      {
         delete this[i];
         
this.Detach(i--);
      }
     }
   return(this.m_data_total);
}

private:
int count(CPositionAgent *inPA)
{
   int lC=0;
   for(int i=0;i<this.Total();i++)
     {
      if(inPA.Compare(this[i],1)==0)
        {
         lC++;
        }
     }
   return(lC);
}

};

class CPositionAgent : public CObject
{
public:

   ulong             meTicket;
   void CPositionAgent::CPositionAgent(ulong inTicket){this.meTicket=inTicket;return;}
   void CPositionAgent::CPositionAgent(){return;}
   int CPositionAgent::Compare(const CObject *node,const int mode=0)const override
   {
   CPositionAgent *inNode = (CPositionAgent*)node;
   if( this.meTicket == inNode.meTicket ) 
      {return(0);
      }
   if( this.meTicket > inNode.meTicket )
     {
      return(1);
     }
   else
     {
      return(-1);
     }
   }
};

void OnStart()
{
 CPositionCollection lCollOfPosAgents;
   
   lCollOfPosAgents.Add(new CPositionAgent(1));
   lCollOfPosAgents.Add(new CPositionAgent(1));
   lCollOfPosAgents.Add(new CPositionAgent(3));
   lCollOfPosAgents.Add(new CPositionAgent(2));   
   lCollOfPosAgents.Add(new CPositionAgent(2));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   lCollOfPosAgents.Add(new CPositionAgent(4));
   
   lCollOfPosAgents.doUnique();
   
   for(int i=0;i<lCollOfPosAgents.Total();i++)
   {
      Print(lCollOfPosAgents[i].meTicket);
   }
}
Причина обращения: