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

 
fxsaber:
Знаю, для чего нужен деструктор. Мне непонятно, для чего перед его определением прописывать слово virtual?
Приписка мне нужна для совместимости кода с С++, поскольку там деструкторы различаются
 
A100:
Приписка мне нужна для совместимости кода с С++, поскольку там деструкторы различаются
Понял, спасибо. Много портируете на MQL5? - поэтому столь специфические примеры?
 
fxsaber:
Знаю, для чего нужен деструктор. Мне непонятно, для чего перед его определением прописывать слово virtual?

Виртуальные функции и деструктор >>>

Основное правило: если у вас в классе присутствует хотя бы одна виртуальная функция, деструктор также следует сделать виртуальным. При этом не следует забывать, что деструктор по умолчанию виртуальным не будует, поэтому следует объявить его явно. Если этого не сделать, у вас в программе почти наверняка будут утечки памяти (memory leaks). Чтобы понять почему, опять же много ума не надо. Рассмотрим несколько примеров. 

 
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, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
Причина обращения: