Ошибка VirtualAlloc failed in large allocator, size=555032

 

Перевести на RU и прочитать могу, но не могу понять суть.

Вылезла ошибка и сразу вылетел советник с графика, других ошибок нет

2023.12.13 07:39:57.222 MQL5 VirtualAlloc failed in large allocator, size=555032

На форуме чёткого ответа не нашёл.

 
Память кончилась, не смог выделить 555 kb.
 
MetaQuotes #:
Память кончилась, не смог выделить 555 kb.

Это может быть из-за частого Print() и наполнения журнала?

Спасибо!

 

часть кода, который захлебнулся

  ZeroMemory(DataArray);
  ArrayResize(DataArray,0);
   for(int i=0; i<100; i++) {
     AddData("num="+i);
     ...
   }

void AddData(string data)
{
  int CurrentSize = ArraySize(DataArray);
  ArrayResize(DataArray,CurrentSize+1);
  DataArray[CurrentSize] = data;
}

Или проблемы с неправильной реализацией работы массива?

ОБНОВИЛ пример кода

 
Vitaly Muzichenko #:

часть кода, который захлебнулся

Или проблемы с неправильной реализацией работы массива?

ОБНОВИЛ пример кода

Почему именно тут? Память может быть была скушана уже до этого... А здесь её не хватило на массив

 
Vitaly Muzichenko #:
Или проблемы с неправильной реализацией работы массива?

Когда обнуляешь размер массива, добавь размер резервируемой под массив памяти:

ArrayResize(DataArray,0,100);

В этом случае физическое распределение памяти будет один раз - при выполнении этой строчки. Иначе - у тебя в цикле будет перераспределение памяти на каждой итерации.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: HistoryTicks

fxsaber, 2018.12.10 13:55

Если в любом MT4/5-советнике в начале прописать такую строку
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

то получите подробное уведомление на случай, если произошла ошибка при выполнении ArrayResize или ArrayCopy.

 
Artyom Trishkin #:

Когда обнуляешь размер массива, добавь размер резервируемой под массив памяти:

В этом случае физическое распределение памяти будет один раз - при выполнении этой строчки. Иначе - у тебя в цикле будет перераспределение памяти на каждой итерации.

Не могу знать изначально, сколько элементов будет заполнено.

В примере 100 = это пример, может быть 1, а может и 200.

Проблему понял, буду исправлять.

Всем спасибо!

 
MetaQuotes #:
Память кончилась, не смог выделить 555 kb.

Никогда не сталкивался с такими малыми величинами при нехватке памяти.

Похоже на утечку.

 
Vitaly Muzichenko #:

Не могу знать изначально, сколько элементов будет заполнено.

В примере 100 = это пример, может быть 1, а может и 200.

Проблему понял, буду исправлять.

Всем спасибо!

Да, НО... При первоначальном выделении памяти под массив будет зарезервирован объём памяти под массив в 100 ячеек + 100 резерва. Т.е. пока i<200 дополнительного перераспределения памяти не будет. А так будет на каждой итерации.

Если i окажется более 200, то будет ещё одно физическое распределение памяти на ещё 100 ячеек. И до 300 опять не будет перераспределения.

 
fxsaber #:

Похоже на утечку.

Хорошая идея проверки своего кода.

Reporting Memory Leaks in Strategy Tester
Reporting Memory Leaks in Strategy Tester
  • www.mql5.com
Monitoring of memory leaks in the strategy tester
Причина обращения: