文章 "MQL5 中对象创建和析构的顺序" - 页 3

 

在文件localvar_testscript_4.mq5

如果在调用 GetPointer() 之后打印指针类型,就会发现指针是POINTER_AUTOMATIC,而不是POINTER_ DINAMIC。

m_array[i]=GetPointer(array[i]);
Print(EnumToString(CheckPointer(m_array[i])));  //POINTER_AUTOMATIC 不是 POINTER_DINAMIC

因此,这一行永远不会被执行

if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
 

<quote.

在这个声明顺序中,items_ array 数组 [5] 销毁之前 销毁。在从items_array 销毁器调用的 Destroy() 函数中,工作是通过指向仍然存在的对象的指针完成的,因此不会发生错误

大家好!

这是我完全不理解的逻辑。=)

毕竟,在 Destroy 方法中,我们将指针的类型与动态类型进行了比较。而我们的类型是自动的。因此,没有使用删除操作符

但这并不是必须的,因为自动创建的对象会被自动删除。

最后,在类外方法的实现阶段,文件忘记为 Destroy 和 SetArray 方法指定返回值 void 的类型,因此会出错。

新手(比如我)可能会被吓到 =)


void CItemArray::Destroy(void)
  {
   for(int i=0;i<ArraySize(m_array);i++)
     {
      if(CheckPointer(m_array[i])!=POINTER_INVALID)
        {
         if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
        }
      else Print("Invalid pointer to delete");
     }
  }