创建和删除对象
mql5程序执行后,内存会按照变量类型分配。根据接入水平,所有变量分成两类-全局变量和局部变量。根据内存等级,它们可以是mql5的输入参数,静态的或者自动的。如果需要,每个变量用相应值初始化。使用后,程序结束,使用的内存回到MQL5执行系统中。
初始化和无法初始化全局变量
mql5程序载入以及调用函数前,全局变量自动初始化。初始化过程是,初始值分配到简易类型变量中,并且调用构造函数(若有的话)。全局范围声明输入变量,程序启动时在对话框中设置初始值。
即使通常在局部范围声明静态变量,但是与全局变量一样,仍要预分配内存,程序载入后初始化。
初始化命令与程序中声明的变量命令一致。相反就执行无法初始化命令。这个规则只适用于非新操作符创建的变量。载入后,变量自动创建和初始化,程序卸载前,无法初始化。
初始化和无法初始化局部变量
如果声明局部变量不是静态的,内存会自动分配。局部变量与全局变量一样,程序遇到局部变量时自动初始化。因此初始化命令与声明命令一致。
局部变量在程序结束时无法初始化。程序模块是复合操作符,是选择操作符切换,循环操作符(for, while, do-while),函数主体,或者if-else 操作符的一部分,
局部变量只在执行程序遇到变量声明时初始化。如果程序执行时,分程序没有执行,那么变量不会初始化。
安置对象的初始化和无法初始化
特殊情况就是对象指针 ,因为声明指针无能导致相关对象初始化。动态的安置对象仅当新操作符创建简单等级时初始化。对象初始化假定调用相关类的构造函数。如果没有类的相关构造函数,简易类型不会自动初始化;字符串, 动态数组 和 复合对象 也会自动初始化。
指针在局部或者全局声明;可以通过空值NULL或者同指针值或遗传类型值初始化。如果新操作符为局部声明指针调用,这个指针的删除操作符退出前也要执行。否则指针消失,对象显性删除失败。
通过表达式object_pointer=new Class_name创建的所有对象一定通过删除操作符(object_pointer)来删除。如果程序完成后因为某种原因无法用删除 操作符删除变量,“专家”日志中会出现相应输入。可以声明几个变量,然后给它们安排一个指针。
如果动态创建的对象有构造函数,执行新操作符时调用这个函数。如果对象有析构函数,执行删除操作符是使用。
因此动态安置的对象只有用新操作符创建,而用删除操作符删除或者执行MQL5卸载程序时删除。动态创建的对象声明的指针不会影响其初始化命令。初始化和无法初始化由程序员控制。
MQL5的动态存储分配
当使用动态数组时,释放的内存立即返回到操作系统。
当使用new操作符从事动态类对象工作时,会从内存管理器工作的类内存池请求最初的内存。如果内存池中没有足够的内存,则从操作系统请求内存。当使用delete 操作符 删除动态对象时,释放的内存立即返回给类内存池。
内存管理器退出下面事件处理函数后立即释放内存返回操作系统:OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent()。
变量简要特征
创建,删除,调用构造函数和析构函数命令的信息如下表。
全局自动变量 |
局部自动变量 |
动态创建对象 |
|
---|---|---|---|
初始化 |
加载mql5后 |
执行中公开代码线到达时 |
执行新操作符 |
初始化命令 |
初始化命令 |
命令声明 |
不考虑命令声明 |
无法初始化 |
mql5程序卸载前 |
推出公示分程序 |
执行删除操作符或者mql5卸载前 |
无法初始化命令 |
与初始化命令相反的命令 |
与初始化命令相反的命令 |
不考虑初始化命令 |
调用构造函数 |
加载mql5程序 |
初始化 |
执行新操作符 |
调用析构函数 |
卸载mql5程序 |
退出变量初始化分程序 |
执行删除操作符 |
错误日志 |
“专家”日志中尝试删除自动创建的对象 |
“专家”日志中尝试删除自动创建的对象 |
“专家”日志,卸载mql5程序时不删除动态穿件的对象。 |
另见