- Локальные переменные
- Формальные параметры
- Статические переменные
- Глобальные переменные
- Input переменные
- Extern переменные
- Инициализация переменных
- Область видимости и время жизни переменных
- Создание и уничтожение объектов
Создание и уничтожение объектов
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости инициализируется соответствующим значением. После использования переменная деинициализируется и память, использованная ею, возвращается исполняемой системе MQL5.
Инициализация и деинициализация глобальных переменных
Инициализация глобальных переменных производится автоматически сразу после загрузки mql5-программы и до вызова любой функции. При инициализации производится присвоение начальных значений переменным простых типов и вызывается конструктор для объектов, если он есть. Входные переменные всегда объявляются на глобальном уровне, инициализируются значениями, задаваемыми пользователями в диалоге при запуске mql5-программы.
Несмотря на то, что статические переменные обычно объявляются на локальном уровне, память под эти переменные распределяется заранее, и инициализация производится сразу после загрузки программы, точно так же как и для глобальных переменных.
Порядок инициализации соответствует порядку объявления переменной в программе, а деинициализация производится в обратном порядке перед выгрузкой mql5-программы. Это правило только для тех переменных, которые не были созданы оператором new. Такие переменные создаются и инициализируются автоматически сразу после загрузки, а деинициализируются непосредственно перед выгрузкой программы.
Инициализация и деинициализация локальных переменных
Если переменная, объявленная на локальном уровне, не является статической, то распределение памяти под такую переменную производится автоматически. Локальные переменные, также как и глобальные, инициализируются автоматически в тот момент, когда выполнение программы встречает объявление локальной переменной. Таким образом, порядок инициализации соответствует порядку объявления.
Локальные переменные деинициализируются в конце блока программы, в котором они объявлены, и в порядке, обратном их объявлению. Блок программы – это составной оператор, который может являться частью оператора выбора switch, цикла(for, while, do-while), телом функции или частью оператора if-else.
Инициализация локальных переменных происходит только в тот момент, когда выполнение программы доходит до объявления переменной. Если в процессе выполнения программы блок, в котором объявлена переменная, не был выполнен, то такая переменная не инициализируется.
Инициализация и деинициализация динамически размещаемых объектов
Особый случай представляют из себя указатели объектов, так как объявление указателя не влечет за собой инициализации соответствующего объекта. Динамически размещаемые объекты инициализируются только в момент создания экземпляра класса оператором new. Инициализация объекта предполагает вызов конструктора соответствующего класса. Если соответствующего конструктора в классе нет, то его члены, имеющие простой тип, не будут автоматически проинициализированы; члены типов строка, динамический массив и сложный объект будут автоматически проинициализированы.
Указатели могут быть объявлены на локальном или глобальном уровне и при этом могут быть проинициализированы пустым значением NULL или значением указателя такого же или порожденного типа. Если для указателя, объявленного на локальном уровне, был вызван оператор new, то и оператор delete для этого указателя должен быть выполнен до выхода из этого уровня. В противном случае указатель будет потерян, и объект не сможет быть удален явно.
Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, то деструктор будет вызван в момент выполнения оператора delete.
Таким образом, динамически размещаемые объекты создаются только в момент создания оператором new и гарантированно уничтожаются либо оператором delete, либо автоматически исполняющей системой MQL5 в момент выгрузки программы. Порядок объявления указателей динамически создаваемых объектов не влияет на порядок их инициализации. Порядок инициализации и деинициализации полностью контролируется программистом.
Особенности работы с динамической памятью
При работе с динамическими массивами освобожденная память сразу же возвращается в систему.
При создании динамического объекта класса через new, память сначала ищется в пуле памяти классов, с которым работает менеджер памяти, и если в пуле недостаточно памяти, то память запрашивается в системе. При удалении динамического объекта через delete, память, занимаемая объектом, возвращается в пул памяти классов.
Менеджер памяти возвращает память в систему сразу после выхода из функций-обработчиков событий: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().
Краткая характеристика переменных
Основные сведения о порядке создания, уничтожении, вызове конструкторов и деструкторов приведены в краткой таблице.
Глобальная автоматическая переменная |
Локальная автоматическая переменная |
Динамически создаваемый объект |
|
---|---|---|---|
Инициализация |
сразу после загрузки mql5-программы |
при достижении в ходе выполнения строки кода, где она объявлена |
при выполнении оператора new |
Порядок инициализации |
в порядке объявления |
в порядке объявления |
не зависит от порядка объявления |
Деинициализация |
перед выгрузкой mql5-программы |
при выходе выполнения из блока объявления |
при выполнении оператора delete или перед выгрузкой mql5-программы |
Порядок деинициализации |
в порядке, обратном инициализации |
в порядке, обратном инициализации |
не зависит от порядка инициализации |
Вызов конструктора |
при загрузке mql5-программы |
при инициализации |
при выполнении оператора new |
Вызов деструктора |
при выгрузке mql5-программы |
при выходе из блока, в котором переменная была инициализирована |
при выполнении оператора delete |
Сообщения об ошибках |
сообщение в журнал "Эксперты" о попытке удаления автоматически созданного объекта |
сообщение в журнал "Эксперты" о попытке удаления автоматически созданного объекта |
сообщение в журнал "Эксперты" о неудаленных динамически созданных объектах при выгрузке mql5-программы |
Смотри также
Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных