下载MetaTrader 5
MQL5参考语言基础变量创建和删除对象 

创建和删除对象

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程序时不删除动态穿件的对象。

另见

数据类型类型密封和扩展变量初始化可见范围和变量使用期


更新: 2015.12.03