ArrayFree

動的配列のバッファを開放し、ゼロ次元のサイズを 0 に設定します。

void  ArrayFree(
  void&  array[]      // 配列
  );

パラメータ

array[]

[in]  動的配列

戻り値

なし

注意事項

全ての使用メモリは一度に解放され、また配列の主な作業は指標/バッファへのアクセスを含むことを考えると、ArrayFree() 関数を使用する必要性はあまり頻繁でありません。バッファサイズは自動的に端末のエグゼクティブサブシステムによって管理されています。

手動でアプリケーションの複雑な動的環境でメモリを管理する必要がある場合には ArrayFree() 関数は、ユーザが明示的に、すぐにすでに不要な動的配列によって占有されていたメモリを解放することを可能にします。

例:

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- 定義済み定数
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| メモリを使用するための Dialog クラス                                       |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
 {
private:
  //--- 配列のサイズ
  int               m_arr_size;
  //--- 配列
  char              m_arr_char[];
  int               m_arr_int[];
  float             m_arr_float[];
  double            m_arr_double[];
  long              m_arr_long[];
  //--- ラベル
  CLabel            m_lbl_memory_physical;
  CLabel            m_lbl_memory_total;
  CLabel            m_lbl_memory_available;
  CLabel            m_lbl_memory_used;
  CLabel            m_lbl_array_size;
  CLabel            m_lbl_array_type;
  CLabel            m_lbl_error;
  CLabel            m_lbl_change_type;
  CLabel            m_lbl_add_size;
  //--- ボタン
  CButton           m_button_add;
  CButton           m_button_free;
  //--- コンボボックス
  CComboBox         m_combo_box_step;
  CComboBox         m_combo_box_type;
  //--- コンボボックスにおける配列型の現在値
  int               m_combo_box_type_value;
 
public:
                    CMemoryControl(void);
                   ~CMemoryControl(void);
  //--- クラスオブジェクトの作成方法
  virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
  //--- チャートイベントハンドラ
  virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
  //--- ラベルを作成する
  bool              CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
  //--- 制御要素を作成する
  bool              CreateButton(CButton &button,const string name,const int x,const int y,const string str,const int font_size,const int clr);
  bool              CreateComboBoxStep(void);
  bool              CreateComboBoxType(void);
  //--- イベントハンドラ
  void              OnClickButtonAdd(void);
  void              OnClickButtonFree(void);
  void              OnChangeComboBoxType(void);
  //--- 現在の配列を使用するメソッド
  void              CurrentArrayFree(void);
  bool              CurrentArrayAdd(void);
 };
//+------------------------------------------------------------------+
//| 現在の配列のメモリを解放する                                             |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
 {
//--- 配列サイズをリセットする
  m_arr_size=0;
//--- 配列を解放する
  if(m_combo_box_type_value==0)
    ArrayFree(m_arr_char);
  if(m_combo_box_type_value==1)
    ArrayFree(m_arr_int);
  if(m_combo_box_type_value==2)
    ArrayFree(m_arr_float);
  if(m_combo_box_type_value==3)
    ArrayFree(m_arr_double);
  if(m_combo_box_type_value==4)
    ArrayFree(m_arr_long);
 }  
//+------------------------------------------------------------------+
//| 現在の配列へのメモリ追加を試みる                                         |
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
 {
//--- 使用メモリサイズが物理メモリサイズを超えた場合終了する
  if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
    return(false);
//--- 現在のタイプに応じてのメモリの割り当てを試みる
  if(m_combo_box_type_value==0 && ArrayResize(m_arr_char,m_arr_size)==-1)
    return(false);
  if(m_combo_box_type_value==1 && ArrayResize(m_arr_int,m_arr_size)==-1)
    return(false);
  if(m_combo_box_type_value==2 && ArrayResize(m_arr_float,m_arr_size)==-1)
    return(false);
  if(m_combo_box_type_value==3 && ArrayResize(m_arr_double,m_arr_size)==-1)
    return(false);
  if(m_combo_box_type_value==4 && ArrayResize(m_arr_long,m_arr_size)==-1)
    return(false);
//--- メモリ割り当てが成功
  return(true);
 }  
//+------------------------------------------------------------------+
//| イベントハンドル                                                       |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMemoryControl)
ON_EVENT(ON_CLICK,m_button_add,OnClickButtonAdd)
ON_EVENT(ON_CLICK,m_button_free,OnClickButtonFree)
ON_EVENT(ON_CHANGE,m_combo_box_type,OnChangeComboBoxType)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| コンストラクタ                                                         |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
 {
 }
//+------------------------------------------------------------------+
//| デストラクタ                                                          |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
 {
 }
//+------------------------------------------------------------------+
//| クラスオブジェクトの作成メソッド                                             |
//+------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
                          const int x1,const int y1,const int x2,const int y2)
 {
//--- 基本クラスオブジェクトを作成する
  if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
    return(false);
ラ//--- 文字列をラベル用に準備する
  string str_physical="Memory physical = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mb";
  string str_total="Memory total = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
  string str_available="Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb";
  string str_used="Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- ラベルを作成する
  if(!CreateLabel(m_lbl_memory_physical,"physical_label",X_START+10,Y_START+5,str_physical,12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_memory_total,"total_label",X_START+10,Y_START+30,str_total,12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_memory_available,"available_label",X_START+10,Y_START+55,str_available,12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_memory_used,"used_label",X_START+10,Y_START+80,str_used,12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_array_type,"type_label",X_START+10,Y_START+105,"Array type = double",12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_array_size,"size_label",X_START+10,Y_START+130,"Array size = 0",12,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_error,"error_label",X_START+10,Y_START+155,"",12,clrRed))
    return(false);
  if(!CreateLabel(m_lbl_change_type,"change_type_label",X_START+10,Y_START+185,"Change type",10,clrBlack))
    return(false);
  if(!CreateLabel(m_lbl_add_size,"add_size_label",X_START+10,Y_START+210,"Add to array",10,clrBlack))
    return(false);
//--- 制御要素を作成する
  if(!CreateButton(m_button_add,"add_button",X_START+15,Y_START+245,"Add",12,clrBlue))
    return(false);
  if(!CreateButton(m_button_free,"free_button",X_START+75,Y_START+245,"Free",12,clrBlue))
    return(false);
  if(!CreateComboBoxType())
    return(false);
  if(!CreateComboBoxStep())
    return(false);
//--- 変数を初期化する
  m_arr_size=0;
//--- 実行成功
  return(true);
 }
//+------------------------------------------------------------------+
//| ボタンを作成する                                                      |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
                                const int y,const string str,const int font_size,
                                const int clr)
 {
//--- ボタンを作成する
  if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
    return(false);
//--- テキスト
  if(!button.Text(str))
    return(false);
//--- フォントサイズ
  if(!button.FontSize(font_size))
    return(false);
//--- ラベルの色
  if(!button.Color(clr))
    return(false);
//--- ボタンを制御要素に加える
  if(!Add(button))
    return(false);
//--- 実行成功
  return(true);
 }
//+------------------------------------------------------------------+
//| 配列サイズのコンボボックスを作成する                                        |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
 {
//--- コンボボックスを作成する
  if(!m_combo_box_step.Create(m_chart_id,"step_combobox",m_subwin,X_START+100,Y_START+185,X_START+200,Y_START+205))
    return(false);
//--- コンボボックスに要素を加える
  if(!m_combo_box_step.ItemAdd("100 000",100000))
    return(false);
  if(!m_combo_box_step.ItemAdd("1 000 000",1000000))
    return(false);
  if(!m_combo_box_step.ItemAdd("10 000 000",10000000))
    return(false);
  if(!m_combo_box_step.ItemAdd("100 000 000",100000000))
    return(false);
//--- 現在のコンボボックス要素を設定する
  if(!m_combo_box_step.SelectByValue(1000000))
    return(false);
//---コンボボックス制御要素に加える
  if(!Add(m_combo_box_step))
    return(false);
//--- 実行成功
  return(true);
 }
//+------------------------------------------------------------------+
//| 配列型コンボボックスを作成する                                            |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
 {
//--- コンボボックスを作成する
  if(!m_combo_box_type.Create(m_chart_id,"type_combobox",m_subwin,X_START+100,Y_START+210,X_START+200,Y_START+230))
    return(false);
//--- コンボボックスに要素を加える
  if(!m_combo_box_type.ItemAdd("char",0))
    return(false);
  if(!m_combo_box_type.ItemAdd("int",1))
    return(false);
  if(!m_combo_box_type.ItemAdd("float",2))
    return(false);
  if(!m_combo_box_type.ItemAdd("double",3))
    return(false);
  if(!m_combo_box_type.ItemAdd("long",4))
    return(false);
//--- 現在のコンボボックス要素を設定する
  if(!m_combo_box_type.SelectByValue(3))
    return(false);
//--- 現在のコンボボックス要素を格納する
  m_combo_box_type_value=3;
//---コンボボックス制御要素に加える
  if(!Add(m_combo_box_type))
    return(false);
//--- 実行成功
  return(true);
 }
//+------------------------------------------------------------------+
//| ラベルを作成する                                                      |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
                                const int y,const string str,const int font_size,
                                const int clr)
 {
//--- ラベルを作成する
  if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
    return(false);
//--- テキスト
  if(!lbl.Text(str))
    return(false);
//--- フォントサイズ
  if(!lbl.FontSize(font_size))
    return(false);
//--- 色
  if(!lbl.Color(clr))
    return(false);
//--- ラベルを制御要素に加える
  if(!Add(lbl))
    return(false);
//--- 成功
  return(true);
 }
//+------------------------------------------------------------------+
//| 「 Add(追加)」 ボタンクリックのイベントハンドラ                       |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
 {
//---配列サイズを増やす
  m_arr_size+=(int)m_combo_box_step.Value();
//--- 現在の配列へのメモリ追加を試みる
  if(CurrentArrayAdd())
    {
    //--- メモリ割り当て成功し、画面上に現在のステータスを表示する
     m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
     m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
     m_lbl_array_size.Text("Array size = "+IntegerToString(m_arr_size));
     m_lbl_error.Text("");
    }
  else
    {
    //--- メモリ割り当て失敗し、エラーメッセージを表示する
     m_lbl_error.Text("Array is too large, error!");
    //--- 以前の配列サイズを返す
     m_arr_size-=(int)m_combo_box_step.Value();
    }
 }
//+------------------------------------------------------------------+
//| 「 Free(解放)」 ボタンクリックのイベントハンドラ                           |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
 {
//--- 現在の配列のメモリを解放する       
  CurrentArrayFree();
//--- 画面上に現在のステータスを表示する。
  m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
  m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
  m_lbl_array_size.Text("Array size = 0");
  m_lbl_error.Text("");
 }
//+------------------------------------------------------------------+
//| コンボボックス変更のイベントハンドラ                          |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
 {
//--- 配列系が変わったかをチェックする
  if(m_combo_box_type.Value()!=m_combo_box_type_value)
    {
    //--- 現在の配列のメモリを解放する       
     OnClickButtonFree();
    //--- 他のタイプの配列を使用する
     m_combo_box_type_value=(int)m_combo_box_type.Value();
    //--- 新しい配列型を画面上の表示する
    if(m_combo_box_type_value==0)
        m_lbl_array_type.Text("Array type = char");
    if(m_combo_box_type_value==1)
        m_lbl_array_type.Text("Array type = int");
    if(m_combo_box_type_value==2)
        m_lbl_array_type.Text("Array type = float");
    if(m_combo_box_type_value==3)
        m_lbl_array_type.Text("Array type = double");
    if(m_combo_box_type_value==4)
        m_lbl_array_type.Text("Array type = long");
    }
 }
//--- CMemoryControlクラスオブジェクト
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- ダイアログを作成する
  if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
    return(INIT_FAILED);
//--- 実行
  ExtDialog.Run();
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//---
  ExtDialog.Destroy(reason);
 }
//+------------------------------------------------------------------+
//| エキスパートチャートイベント関数                                     |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
 {
  ExtDialog.ChartEvent(id,lparam,dparam,sparam);
 }