Локальный массив, такая его работа нормальна?

 

Объявляем локальный массив, без распределения памяти под него (делать это будем дальше в функции). Но уже на следующем тике (при новом входе в функцию), массив у нас уже имеет размер и содержит предыдущие значения.( как-будто объявлен на глобальном уровне)

Локальный массив при выходе из функции, не уничтожается и живет своей жизнью.

Вот код для проверки (эксперт).

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
   int narr,array[];
//-----------------------------
   narr=ArraySize(array);
   Print(narr);
   if(narr>0) {
      Print(array[0],"; ",array[1],"; ",array[2]);
   }
   ArrayResize(array,3);
   array[0]=1;
   array[1]=3;
   array[2]=6;
   return;
}

Вот лог:

12:27:15 e-test USDCHF,M1: loaded successfully
12:27:20 e-test USDCHF,M1: initialized
12:27:22 e-test USDCHF,M1: 0
12:27:26 e-test USDCHF,M1: 3
12:27:26 e-test USDCHF,M1: 1; 3; 6
12:27:40 e-test USDCHF,M1: 3
12:27:40 e-test USDCHF,M1: 1; 3; 6
12:27:41 e-test USDCHF,M1: 3
12:27:41 e-test USDCHF,M1: 1; 3; 6
12:27:43 e-test USDCHF,M1: deinitialized


Это нормально и я чего-то не понимаю или всетаки ошибка?

билд 225

 
Это ненормально, но использовать этот эффект в рабочих программа я бы не рекомендовал. Локальная переменная должна создаваться заново при каждом вызове функции и не факт, что в какой-то момент между вызовами она не уничтожится.
 

Это было сделано специально. В mql4 все массивы с динамическим распределением памяти. Поэтому было принято решение не удалять буфер массива при выходе из функции, чтобы избежать излишней фрагментации памяти, так как в большинстве случаев массив каждый раз получает один и тот же размер. Особенно это актуально для массивов строк.

В документации об этом сказано

Замечание: массив, объявленный на локальном уровне в какой-либо функции, у которого был изменен размер, останется неизменным после завершения работы функции. При повторном вызове функции такой массив будет иметь размер, отличный от объявленного.

 

поставь инициализацию...

ваше в мкл5 там с этим полный бордак в создаваемом массиве может находится разный мусор

когда в мкл4 программам вроде к этому более серьезно подходили

тут хотя бы при создании он пуст =))

 
Более года назад Rosh ответил https://www.mql5.com/ru/forum/56854 по аналогичному поводу. Тогда я еще не знал об этом форуме.
 
Документацию пролистал, но не нашел сразу замечание, ясно, спасибо.
 
Talex:

Объявляем локальный массив, без распределения памяти под него (делать это будем дальше в функции).

Массивы лучше не объявлять/распределять внутри часто повторяемой функции, а передавать их туда. Это оптимальней делать один раз при инициализации и лишь при необходимости расширять - а лучше решить на уровне алгоритма шоб массив не рос.