
- www.mql5.com
Причем тут ZeroMemory? Мне нужно не занулить массив тиков, а освободить память от не используемых элементов. Физически освободить.

- 2019.03.14
- www.mql5.com
Ну название этой функции говорит что делает именно то что вам нужно, врёт!?
"[in] [out] Переменная, передаваемая по ссылке, которую требуется обнулить (инициализировать нулевыми значениями)."
Данная функция обнуляет переменные. Т.е. если у вас было int array[3] = {1, 2, 3}, после вызова ZeroMemory(array), во всех 3 элементах будут нули.
Спасибо, видимо без костылей никак, но с ArraySwap легче.
Освобождение памяти MQL5 программы не возвращает ее в операционную систему, а оставляет в своих пулах памяти для последующего использования.
Скорость любой сложной программы напрямую зависит от умения управлять памятью, особенно на массовых перевыделениях.
Поэтому в MQL5 используются свои специфические пулы памяти под разные задачи и типы данных. Их цель - обеспечить максимальную скорость выделений/удалений/перевыделений и быть отделенными от основной памяти терминала, чтобы обеспечить песочницу.
Не надо думать, что TerminalInfoInteger(TERMINAL_MEMORY_USED) или TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) обязаны показывать "правильные" с вашей точки зрения данные.
Так это не костыль, это фича от разрабов. Если передать reserve -1 то разница между реальной и используемой памятью схлопывается. это же ответ на вопрос почто точь-в-точь совпадающий с вашим.
Да, ArrayResize(arr,0,-1) - это специальный случай для освобождения/отвязки памяти от массива.
Но память все равно возвращается в один из MQL5 пулов, если это не большой кусок памяти. Большие куски памяти выделяются у операционки, так как для них нет эффекта от использования пула.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Имеется массив MqlTick. Данный массив хранит тики за продолжительный период (запрос CopyTicksRange выполняется долго и для минимизации вызова данной функции, тики копируются с большим запасом). После того, как старые тики более не нужны, произвожу удаление старых тиков функцией ArrayRemove. Однако, высвобождения памяти не происходит. Так же как и при ручном сдвиге массива и изменением размера при помощи ArrayResize. Приходится вставлять костыль вроде:
MqlTick ticks[]
CopyTicksRange(.....);
.....
MqlTick cleared_ticks[];
ArrayResize(cleared_ticks, ticks_left);
for (int i = 0; i < ticks_left; ++i)
cleared_ticks[i] = ticks[i + ticks_left];
ArrayFree(ticks);
ArrayCopy(ticks, cleared_ticks);
ArrayFree(cleared_ticks);
Подобная конструкция ужасна и неэффективна. Как заставить высвобождать память функциямми ArrayRemove или хотя бы ArrayResize???