Обсуждение статьи "Порядок создания и уничтожения объектов в MQL5" - страница 3

 

В файле localvar_testscript_4.mq5

Если после вызова GetPointer() вывести тип указателя, то окажется, что указатели являются POINTER_AUTOMATIC, а не POINTER_DINAMIC.

m_array[i]=GetPointer(array[i]);
Print(EnumToString(CheckPointer(m_array[i])));  //POINTER_AUTOMATIC не POINTER_DINAMIC

Поэтому эта строка никогда не выполняется

if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
 

<цитата>

@При таком порядке объявления уничтожение items_array происходит до уничтожения массива объектов array[5]. В функции Destroy(), которая вызывается из деструктора items_array, работа ведётся с указателями на ещё существующие объекты, поэтому никаких ошибок не возникает.@ </цитата>

Всем привет!

Вот тут я логики вообще не понял. =) 

Ведь в методе Destroy мы сравниваем тип нашего указателя с динамическим типом. А наш тип автоматический. Следовательно до оператора delete дело просто не доходит.

Но он и не нужен, ведь автоматически созданные объекты удаляются автоматически.

И последнее, в файле забыли указать тип возвращаемого значения void для методов Destroy и SetArray на этапе реализации методов за пределами Класса из-за чего выбивает ошибку.

Новички (как я) могут пугаться =)


void CItemArray::Destroy(void)
  {
   for(int i=0;i<ArraySize(m_array);i++)
     {
      if(CheckPointer(m_array[i])!=POINTER_INVALID)
        {
         if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
        }
      else Print("Invalid pointer to delete");
     }
  }