Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Деструкторы в MQL5 всегда виртуальные. Удаляется всё правильно, попробуйте проставить Print(__FUNCSIG__); в деструкторах.
Я это делал в VC++, но механизмы освобождения памяти думаю одинаковы?
Но Ваш пример будет работать правильно, т.к. можно указать виртуальный деструктор только базового класса.
Попробую высказать идею немного по-другому:
Дано:
Действия:
P.S: на рисунке модель памяти )
Сомнения потому что, указатель на класс номер один, а фактически в памяти класс номер два. Ведь в случаи с деструкторами это имеет значение, вот я и подумал, а вдруг и здесь может быть проблема. Думаю что в подобной ситуации правильное освобождение памяти может произойти только если в памяти есть какие-то метки (как char с нуль-терминатором) или что-то вроде, поэтому и спрашивал про то как выделяется память.
Ваше сомнение от того что вы не прописали конструкторы (для понимания что происходит в данном случае это важно), попробуйте запустить вот этот пример, и вы всё поймёте:
ЗЫ само конструирование как и удаление происходит ступеньчато, и вся эта информация хранится(сам виртуальный указатель помнить что класс был сконструирован как составной от базового и потомка), и при удалении происходит вызов деструкторов в обратном порядке, от более позднего к более раннему.
Дело не в деструкторах, они не главное, дело в самом классе, а точнее в том какое количество байт он занимает. Получается так что мы выделяем 200 байт, а потом гоорим освободи мне память на которую указывает указатель, представляющий объект размером 100 байт.
Да пул памяти знает какой длины кусок будет освобождаться вызовом delete.
Где хранится эта информация зависит от реализации пула.
Например в если Вы в С++ отдадите указатель на объект который не выделялся через new, то увидите, как Ваше приложение завершится крахом.
Дело не в деструкторах, они не главное, дело в самом классе, а точнее в том какое количество байт он занимает. Получается так что мы выделяем 200 байт, а потом гоорим освободи мне память на которую указывает указатель, представляющий объект размером 100 байт.
Я так понимаю Ваш вопрос связан с особенностями работы пула памяти.
Да пул памяти знает какой длины кусок будет освобождаться вызовом delete.
Где хранится эта информация зависит от реализации пула.
Например в если Вы в С++ отдадите указатель на объект который не выделялся через new, то увидите, как Ваше приложение завершится крахом.