🔁
MQL5 对象生命周期:创建与析构顺序
全局/局部/动态三类对象的创建与析构规则与避坑
#MQL5#OOP#对象#析构#内存
MQL5 基于面向对象编程,对象分全局、局部、动态三类,析构都按“与构造相反”的顺序。理解这套规则,是写出不漏内存、不崩盘的 EA 的基础。
一、三类对象的创建与析构
- 全局对象:先声明先构造,退出时反向析构;
- 局部对象:进入程序块才创建,退出块时逆序析构;
- 动态对象:用 new 创建、delete 删除,时机完全由你掌控。
二、全局与局部的统一规则
无论全局还是局部,析构都按与构造相反的顺序进行;若某程序块没执行(如 input 开关为 false),里面的局部对象根本不会被创建。
✦ 查错口诀
记住“构造顺序=声明顺序,析构顺序=反着来”,遇到 undeleted objects 或 invalid pointer 日志时,先对照这个规则查。
三、动态对象的责任在你
- new 出来的对象必须 delete;
- 同一对象只能删一次;
- 删前用 CheckPointer 判断有效性;
- 重复 delete 会报 delete invalid pointer。
四、指针数组的坑
多个指针数组指向同一 new 对象时,只能删一次,第二次删报无效指针;漏删则日志报 N undeleted objects left。
⚠ 声明顺序影响安全
若含指针数组的类对象先于原数组对象声明,它析构时原数组已没,指针失效。调换声明顺序即可避免。
五、组合类的正确姿势
- 类里含其他对象指针时,析构函数调用保护型 Destroy();
- 用 CheckPointer 规避无效指针;
- 安排好成员与原对象的声明/析构先后;
- 用 EA 日志定位错误管理。
常见问题
这是 OOP 通用约定,保证依赖关系安全——后构造的可能依赖先构造的,所以先拆后者。
MQL5 退出时会回收,但日志会报警 undeleted objects left;长期运行的 EA 若反复 new 不删才会真泄漏。
区分 POINTER_DYNAMIC / POINTER_INVALID,删除前调用它判断,避免删到无效或已删指针导致崩溃。
只在一个地方负责 delete,另一个指针置空或标记不拥有,防止重复删除。
会。组合类里若持有指针成员的类先析构、而它指向的原对象已先被析构,就会访问失效指针;调顺序是最简单的修法。