Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 26
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы создаете копии объектов в AddValue через new, но не освобождаете их в деструкторе, просто список указателей очищаете.
в справке написано, что при вызове деструктора будут также вызваны деструкторы классов которые использовались
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
не припомню случая, чтобы терминал после выгрузки скрипта не записал в лог предупреждение об не уничтоженных объектах - мой пример не выводит такое предупреждение
Во-вторых, по правильному нужно было через конструктор копирования сделать, а не оператор присваивания. Но это все ИМХО)
по сообщениям разработчиков я находил информацию, что простые структуры или классы в MQL копируются всегда и без проблем, несколько раз я проверял, вроде так и есть, пока пользуюсь возможностями языка
тут в общем к чему все обсуждение - MQL это не С++, я давно перестал искать аналогии между ними, написали разработчики что вот так реализовано - проверил, работает - значит можно использовать, если критично иметь стандартный С++ синтаксис, вынести всю логику в .dll не составляет труда
Вы создаете копии объектов в AddValue через new, но не освобождаете их в деструкторе, просто список указателей очищаете.
Во блин! А как можно в деструкторе удалить экземпляр класса, созданный через new. Попробуйте. Не получиться.
Можно это сделать только в деструкторе другого класса.
Во блин! А как можно в деструкторе удалить экземпляр класса, созданный через new. Попробуйте. Не получиться.
Можно это сделать только в деструкторе другого класса.
Речь и шла о деструкторе другого класса. Я говорил об элементах, созданных через new в методе AddValue
в справке написано, что при вызове деструктора будут также вызваны деструкторы классов которые использовались
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
не припомню случая, чтобы терминал после выгрузки скрипта не записал в лог предупреждение об не уничтоженных объектах - мой пример не выводит такое предупреждение
по сообщениям разработчиков я находил информацию, что простые структуры или классы в MQL копируются всегда и без проблем, несколько раз я проверял, вроде так и есть, пока пользуюсь возможностями языка
тут в общем к чему все обсуждение - MQL это не С++, я давно перестал искать аналогии между ними, написали разработчики что вот так реализовано - проверил, работает - значит можно использовать, если критично иметь стандартный С++ синтаксис, вынести всю логику в .dll не составляет труда
Да увидел в справке... Очень неявная штука, похожая больше на костыль, вместо unique_ptr...
Да увидел в справке... Очень неявная штука, похожая больше на костыль, вместо unique_ptr...
И настолько удобная, что и костылём назвать "рука не поднимается":
Создали объект любого класса, поместили его в список-хранилище, и больше не нужно заботиться о его удалении - подсистема терминала сама всё почистит.
Но можно и задать ручное управление, и "бегать" за всеми вновь создаваемыми объектами в попытках отследить когда, где и для каких нужд он был создан, и нужен ли он теперь. Не нужен - удалить. А ошибся - нужен оказывается был - вылетел по обращению к невалидному указателю...
Так что костыль - как раз "беготня за объектами" в поисках их ненадобности и переживании об утечках памяти в случае, ежли не догнал-таки какой-то из объектов.
Во-вторых, по правильному нужно было через конструктор копирования сделать, а не оператор присваивания. Но это все ИМХО)
как правильно копировать, пример можете привести для этого шаблона?
я пользовался справкой для написания метода AddValue https://www.mql5.com/ru/docs/basis/types/classes
всю голову сломал, но я не вижу в MQL другого решения чем я написал в своем примере!
Вашу реализацию правильного хранения данных покажите
И настолько удобная, что и костылём назвать "рука не поднимается":
Создали объект любого класса, поместили его в список-хранилище, и больше не нужно заботиться о его удалении - подсистема терминала сама всё почистит.
Но можно и задать ручное управление, и "бегать" за всеми вновь создаваемыми объектами в попытках отследить когда, где и для каких нужд он был создан, и нужен ли он теперь. Не нужен - удалить. А ошибся - нужен оказывается был - вылетел по обращению к невалидному указателю...
Так что костыль - как раз "беготня за объектами" в поисках их ненадобности и переживании об утечках памяти в случае, ежли не догнал-таки какой-то из объектов.
Тут идет речь о том, что после добавления указателя в коллекцию он также остается у вас. Это первое.
в справке написано, что при вызове деструктора будут также вызваны деструкторы классов которые использовались
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
не припомню случая, чтобы терминал после выгрузки скрипта не записал в лог предупреждение об не уничтоженных объектах - мой пример не выводит такое предупреждение
по сообщениям разработчиков я находил информацию, что простые структуры или классы в MQL копируются всегда и без проблем, несколько раз я проверял, вроде так и есть, пока пользуюсь возможностями языка
тут в общем к чему все обсуждение - MQL это не С++, я давно перестал искать аналогии между ними, написали разработчики что вот так реализовано - проверил, работает - значит можно использовать, если критично иметь стандартный С++ синтаксис, вынести всю логику в .dll не составляет труда
а треугольный массив с помощью этого можно сделать?
Ввиду ограничений языка вряд ли что-то приличное получится. У меня такой костыль родился (лёгенькая обёртка над стандартным массивом)
Для хранения указателей - написать обёртку юник_птр (хотя полноценный не получится, но ауто_птр хотя бы). На мой взгляд, даже такой примитив много удобней шаблонных аналогов из стд.