Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - страница 7
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Приложение "Ножницы" найдите в Windows, там выбрать область, скопируется в буфер, и потом тут Shift+Insert вставить
Спасибо, разберемся.
Для чего перед выходом из функции вызывать ArrayFree(), передавая туда локальный динамический массив? Разве это не бессмысленно? Я думал, что память под локальный динамический массив всегда освобождается после выхода из функции.
Следующий тест показывает, что ArrayFree в подобных местах лишен смысла. Там test2() использует ArrayFree, а test1() не использует. И разницы при этом никакой.
Для чего перед выходом из функции вызывать ArrayFree(), передавая туда локальный динамический массив?
Я добавил ArrayFree из-за того, что в массиве появляются значения тогда, когда их не должно быть, сразу после его объявления, но и ArrayFree никак не изменила ситуацию.
На память я вообще не смотрел.
У меня были те значения в массиве тогда, когда их не должно быть, и я решил добавить ArrayFree, но и она никак не изменила ситуацию.
Что вы ожидаете там увидеть, кроме кроме случайных мусорных значений? Для чего там ArrayFree?
Что вы ожидаете там увидеть, кроме кроме случайных мусорных значений?
Всегда 0 до цикла for, как и при первом объявлении массива (при запуске терминала) до смены ТФ или перекомпиляции эксперта.
А почему там могут быть мусорные значения в этом момент после объявления?
Для чего там ArrayFree?
Для этого: освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0. Я думал, после ArrayFree ложные значения появляться не будут.
Я думал, что память под локальный динамический массив всегда освобождается после выхода из функции.
А, ну вот же
https://www.mql5.com/ru/docs/basis/types/dynamic_array
Динамические массивы автоматически освобождаются при выходе за пределы области видимости блока, в котором они объявлены.
Для чего тогда там ArrayFree и с чем именно будут разбираться MQ?
А почему там могут быть мусорные значения в этом момент после объявления?
Вот косвенное свидетельство:
https://www.mql5.com/ru/docs/array/arrayinitialize
При последующих увеличениях размера массива array функцией ArrayResize() в пределах текущего резерва, в конец массива добавляются элементы, значения которых не определены и, чаще всего, не равны init_val.
Я не нашел в документации буквального заявления о том, что при увеличении размера массива значения новых элементов (простых типов) будут не определены.
По поводу использования ArrayFree. Я подозреваю (но это не точно), что ArrayFree просто помечает память как свободную, не изменяя то, что в этой памяти лежит. Если даже представить, что ArrayFree "обнулял" бы содержимое освобождаемой памяти, то почему вы думаете, что при следующем вызове функции вы получите под массив ровно тот-же кусок памяти? К стати, по поводу того-же куска памяти:
https://www.mql5.com/ru/docs/basis/variables/object_live
При работе с динамическими массивами освобожденная память сразу же возвращается в систему.
Менеджер памяти возвращает память в систему сразу после выхода из функций-обработчиков событий: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().Ладно, на этом мои полномочия все. Я могу ошибаться. У меня недостаточно квалификации, чтобы рассуждать о том, что именно происходит с памятью под капотом.
https://www.mql5.com/ru/docs/basis/variables/local#stack
Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию память под локальные нужды выделять в системе (new, ArrayResize()), а при выходе из функции производить освобождение памяти (delete, ArrayFree()).
Локальные данные (объявлены внутри функции), размещены в куче, память под которые необходимо освобождать с помощью ArrayFree при выходе из функции... MQ, можно, пожалуйста, пример, демонстрирующий такую необходимость?
[edit] То есть, речь идет об объявленном локально динамическом массиве. Разве нет противоречия с цитатой ниже?
https://www.mql5.com/ru/docs/basis/types/dynamic_array
Динамические массивы автоматически освобождаются при выходе за пределы области видимости блока, в котором они объявлены.
MetaTrader 5 x64 build 5120 started for MetaQuotes Ltd.
Windows 11 build 22631
Терминал игнорирует то, что в Windows установлена темная тема и при включенной в терминале теме "Системная" отображается в светлой теме.
Build 5125.
Если в терминале выставлена цветовая тема "Системная", а в винде стоит "Темная", то терминал не отображается в темной теме.
На выставление в терминале Светлой или Темной темы терминал реагирует. Работает только ручное изменение темы в терминале.
Поясните, пожалуйста, какой (чьей) Системной теме терминал соответствует?
Вроде, элементарный баг, который разработчики просто игнорируют исправлять. А жаль.