在编程的世界里,理解变量和对象的创建和删除过程非常重要。在MQL4程序执行过程中,根据变量的类型,为每个变量分配内存。根据访问级别,所有变量分为全局变量和局部变量。按照内存类别,它们可以是MQL4程序的输入参数,静态和自动的。如有需要,每个变量都由相应的值进行初始化。在变量使用完毕后,它会被反初始化,其占用的内存将被返还给MQL4执行系统。
全局变量的初始化和反初始化
全局变量在MQL4程序加载后自动初始化,且在任何函数调用之前。初始化过程中,为简单类型的变量赋值,并调用对象的构造函数(如果有的话)。输入变量总是在全局级别声明,并由用户在程序启动期间的对话框中设置的值进行初始化。
尽管静态变量通常在局部级别声明,但是这些变量的内存是预先分配的,它们在程序加载后立即初始化,就像全局变量一样。
初始化顺序与程序中变量声明的顺序相符。反初始化则按照相反的顺序进行。此规则只适用于未通过new操作符创建的变量。这些变量在加载后立即自动创建和初始化,并在程序卸载前反初始化。
局部变量的初始化和反初始化
如果在局部级别声明的变量不是静态的,那么系统会自动为这种变量分配内存。局部变量和全局变量一样,在程序执行遇到他们的声明时自动初始化。因此,初始化顺序与声明顺序相符。
局部变量在它们被声明的程序块结束时进行反初始化,并按照与声明相反的顺序进行。程序块是一个复合操作符,它可以是switch选择操作符的一部分,循环操作符(for,while,do-while),函数体或者if-else操作符的一部分。
局部变量只有在程序执行遇到变量声明时才会被初始化。如果在程序执行期间没有执行声明变量的块,那么这个变量就不会被初始化。
动态放置对象的初始化和反初始化
动态放置对象指针的情况特殊,因为指针的声明并不意味着相应对象的初始化。动态放置的对象只有在通过new操作符创建类样本时才被初始化。对象的初始化假定调用相应类的构造函数。如果类中没有相应的构造函数,其简单类型的成员将不会自动初始化;字符串类型,动态数组和复杂对象的成员将自动初始化。
可以在局部或全局级别声明指针;并且它们可以由NULL的空值或者相同或继承类型的指针值进行初始化。如果在局部级别声明的指针调用了new操作符,那么必须在退出该级别前对这个指针执行delete操作符。否则,指针将丢失,对象的显式删除将失败。
所有通过表达式object_pointer=new Class_name创建的对象,都必须通过delete(object_pointer)操作符进行删除。如果出于某些原因,这种变量在程序完成时没有被delete操作符删除,那么”Experts”日志中将出现相应的条目。可以声明多个变量,并将一个对象的指针赋给它们所有。
如果动态创建的对象有一个构造函数,那么在执行new操作符的时候,这个构造函数将被调用。如果对象有一个析构函数,那么在执行delete操作符时,它将被调用。
因此,动态放置的对象只有在调用相应的new操作符的时刻才被创建,且在delete操作符执行或者由MQL4执行系统在程序卸载时自动删除。指针的声明顺序并不影响它们的初始化顺序。初始化和反初始化的顺序完全由程序员控制。
MQL4的动态内存分配
在使用动态数组时,释放的内存立即返回给操作系统。
当使用new操作符处理动态类对象时,首先从类内存池请求内存,内存管理器正在使用这个池。如果池中的内存不足,就从操作系统请求内存。使用delete操作符删除动态对象后,释放的内存立即返回到类内存池。
内存管理器在退出以下事件处理函数后立即将内存释放回操作系统:OnInit(),OnDeinit(),OnStart(),OnTick(),OnCalculate(),OnTimer(),OnTester(),OnChartEvent()。
变量的简要特性
关于创建、删除、构造函数和析构函数调用的顺序的主要信息在下表中给出。
全局自动变量
- 初始化:加载mql4程序后立即初始化
- 初始化顺序:按照声明的顺序
- 反初始化:在mql4程序卸载前进行
- 反初始化顺序:与初始化顺序相反
- 构造函数调用:在mql4程序加载时调用
- 析构函数调用:在mql4程序卸载时调用
- 错误日志:如果尝试删除自动创建的对象,”Experts”日志会记录信息
局部自动变量
- 初始化:在执行过程中到达声明代码行时
- 初始化顺序:按照声明的顺序
- 反初始化:在执行退出声明块时
- 反初始化顺序:与初始化顺序相反
- 构造函数调用:在初始化时调用
- 析构函数调用:在退出初始化变量
的块时调用
- 错误日志:如果尝试删除自动创建的对象,”Experts”日志会记录信息
动态创建的对象
- 初始化:在执行new操作符时
- 初始化顺序:与声明的顺序无关
- 反初始化:当执行delete操作符或在mql4程序卸载前
- 反初始化顺序:与初始化顺序无关
- 构造函数调用:在执行new操作符时调用
- 析构函数调用:在执行delete操作符时调用
- 错误日志:如果在卸载mql4程序时未删除动态创建的对象,”Experts”日志会记录信息
总结
理解对象和变量的创建、初始化和删除过程对于编程非常重要。熟练掌握这些概念不仅可以提高代码的效率,还有助于避免内存泄漏和其它潜在的问题。希望通过上述描述和示例,读者能够深入理解这一核心概念,并在编程实践中灵活运用。