記事"MQL5でのオブジェクト作成と削除の順番"についてのディスカッション - ページ 3

 

ファイルlocalvar_testscript_4.mq5で

GetPointer()を呼び出した後にポインタ・タイプを表示すると、ポインタがPOINTER_DINAMICではなくPOINTER_AUTOMATIC であることがわかります。

m_array[i]=GetPointer(array[i]);
Print(EnumToString(CheckPointer(m_array[i])));  POINTER_DINAMICではなく //POINTER_AUTOMATIC

したがって、この行は決して実行されない。

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

<引用

この宣言順序では、items_ arrayは オブジェクトの配列 array [5] が破棄される前に破棄される。items_arrayの デストラクタから呼び出されるDestroy()関数では、まだ存在するオブジェクトへのポインタで処理が行われるため、エラーは発生しません

皆さん、こんにちは!

このあたりからロジックが全く理解できなくなってきました。=)

結局のところ、Destroyメソッドではポインタの型を動的な型と比較しています。そして、私たちの型は自動的です。したがって、delete演算 子は使われません。

自動生成されたオブジェクトは自動的に削除されるからだ。

そして最後に、このファイルはクラス外のメソッドを実装する段階で、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");
     }
  }