Ошибки, баги, вопросы - страница 1785
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Понял, спасибо. Много портируете на MQL5? - поэтому столь специфические примеры?
Виртуальные функции и деструктор >>>
{
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}
На сей раз конструируется объект так, как и надо, а при разрушении происходит утечка памяти, потому как деструктор производного класса не вызывается.
Происходит это потому, что удаление производится через указатель на базовый класс и для вызова деструктора компилятор использует раннее связывание. Деструктор базового класса не может вызвать деструктор производного, потому что он о нем ничего не знает. В итоге часть памяти, выделенная под производный класс, безвозвратно теряется.Чтобы этого избежать, деструктор в базовом классе должен быть объявлен как виртуальный.
Не понимаю архитектурно, почему, сделав базовый деструктор виртуальным, появляется инфа о проиводном деструкторе.
Сейчас понимаю так, что когда базовый виртуальный, то определяя производный деструктор мы вместо базового деструктора делаем замену на производный. Но тогда базовый деструктор не должен в этом примере вызываться.
Очевидно, что не догоняю, как устроено. С виртуальными функциями в MQL5 никогда не было проблем. За счет них во многом очень нравится ООП. И думал, что все понимаю. А тут полный затык. Прошу объяснить на пальцах.
Портирую мало. Специфичные только на первый взгляд. Тут кто-то из "специалистов" писал что ВСЕГО больше 3-х производных классов вредно. У меня часто только 3-4 базовых класса уходит на правильную инициализацию и только потом уже начинаются настоящие производные
Но тогда базовый деструктор не должен в этом примере вызываться.
Он вызывается производным деструктором неявно. В этом собственно и отличие от простых виртуальных функций.
Ошибка возврата не актуальных данных функцией SymbolInfoTick() - перескок тиков. Билд 1525 х64. Тест из индикатора, на советнике не проверял:
Реал, Открытие, Access Server V. Печаль! Обратите внимание на проблему, пожалуйста. А также на проблему в заявке #1598238 (начиная с 10 стр., пост от 2017.01.26 09:43).
Уважаемые разработчики, давайте править тики! Код предоставлен, вот она - проблема, ничего искать не нужно, только отреагируйте и исправьте!
Если заменить OnCalculate на OnTick, ошибки не сыпятся. Проблем не в SymbolInfoTick, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.
Замерял десять минут на Si.
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.