Ошибки, баги, вопросы - страница 1785

 
fxsaber:
Понял, спасибо. Много портируете на MQL5? - поэтому столь специфические примеры?
Портирую мало. Специфичные только на первый взгляд. Тут кто-то из "специалистов" писал что ВСЕГО больше 3-х производных классов вредно. У меня часто только 3-4 базовых класса уходит на правильную инициализацию и только потом уже начинаются настоящие производные
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

На сей раз конструируется объект так, как и надо, а при разрушении происходит утечка памяти, потому как деструктор производного класса не вызывается.

Происходит это потому, что удаление производится через указатель на базовый класс и для вызова деструктора компилятор использует раннее связывание. Деструктор базового класса не может вызвать деструктор производного, потому что он о нем ничего не знает. В итоге часть памяти, выделенная под производный класс, безвозвратно теряется.

Чтобы этого избежать, деструктор в базовом классе должен быть объявлен как виртуальный.

Не понимаю архитектурно, почему, сделав базовый деструктор виртуальным, появляется инфа о проиводном деструкторе.

Сейчас понимаю так, что когда базовый виртуальный, то определяя производный деструктор мы вместо базового деструктора делаем замену на производный. Но тогда базовый деструктор не должен в этом примере вызываться.

 

Очевидно, что не догоняю, как устроено. С виртуальными функциями в MQL5 никогда не было проблем. За счет них во многом очень нравится ООП. И думал, что все понимаю. А тут полный затык. Прошу объяснить на пальцах.

 
A100:
Портирую мало. Специфичные только на первый взгляд. Тут кто-то из "специалистов" писал что ВСЕГО больше 3-х производных классов вредно. У меня часто только 3-4 базовых класса уходит на правильную инициализацию и только потом уже начинаются настоящие производные
Примерчик бы, как профи (в моем понимании) на MQL5 пишут.
 
fxsaber:

Но тогда базовый деструктор не должен в этом примере вызываться.

Он вызывается производным деструктором неявно. В этом собственно и отличие от простых виртуальных функций.
 
Комбинатор:
Он вызывается производным деструктором неявно. В этом собственно и отличие от простых виртуальных функций.
Спасибо. Получается, что виртуальный деструктор - это не просто виртуальная функция, которая вызывается во время уничтожения объекта, а какая-то более хитрая сущность.
 
fxsaber:
Ну ему объект надо удалить ) в этом вся хитрость
 
Alexey Kozitsyn:

Ошибка возврата не актуальных данных функцией SymbolInfoTick() - перескок тиков. Билд 1525 х64. Тест из индикатора, на советнике не проверял:

Реал, Открытие, Access Server V. Печаль! Обратите внимание на проблему, пожалуйста. А также на проблему в заявке #1598238 (начиная с 10 стр., пост от 2017.01.26 09:43).

Уважаемые разработчики, давайте править тики! Код предоставлен, вот она - проблема, ничего искать не нужно, только отреагируйте и исправьте!

Если заменить OnCalculate на OnTick, ошибки не сыпятся. Проблем не в SymbolInfoTick, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
[Удален]  
fxsaber:
Если заменить OnCalculate на OnTick, ошибки не сыпятся. Проблем не в SymbolInfoTick, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?
 
Alexey Kozitsyn:
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?

SymbolInfoTick в индикаторах работает совсем не так, как в советниках.

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

В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.

Замерял десять минут на Si. 

[Удален]  
fxsaber:

SymbolInfoTick в индикаторах работает совсем не так, как в советниках.

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

В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние. 

Значит очередь тиков косая. В любом случае нужно разбираться с работой в индикаторах. Такое ощущение складывается, что основной упор делается на тестирование функций для работы с советниками. Это первое. Второе - Вы уверены, что SymbolInfoTick() синхронная функция? Третье, даже если с SymbolInfoTick() все в порядке - она все равно работает лучше, чем CopyTicks(), т.к. зачастую возвращает более актуальные значения. Короче, как я и сказал, ошибок с тиками много. А разработчики молчат...