ArrayFree

동적 배열의 버퍼가 해제되고 0차원의 크기가 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
//+------------------------------------------------------------------+
//| 메모리 작업을 위한 대화상자 클래스                             |
//+------------------------------------------------------------------+
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="물리적 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mb";
   string str_total="전체 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
   string str_available="사용가능 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb";
   string str_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);
  }
//+------------------------------------------------------------------+
//| "추가" 버튼 이벤트 클릭 처리기 event                           |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
  {
//--- 배열 크기 증가
   m_arr_size+=(int)m_combo_box_step.Value();
//--- 현재 배열에 대해 메모리 할당 시도
   if(CurrentArrayAdd())
     {
      //--- 할당된 메모리, 화면에 현재 상태 표시
      m_lbl_memory_available.Text("사용 가능 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
      m_lbl_memory_used.Text("사용되는 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
      m_lbl_array_size.Text("배열 크기 = "+IntegerToString(m_arr_size));
      m_lbl_error.Text("");
     }
   else
     {
      //--- 메모리 할당 실패, 오류 메시지 표시
      m_lbl_error.Text("오류 발생, 배열이 너무 큽니다!");
      //--- 이전 배열 크기를 반환
      m_arr_size-=(int)m_combo_box_step.Value();
     }
  }
//+------------------------------------------------------------------+
//| "무료" 버튼 이벤트 처리기                          |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
  {
//--- 현재 배열의 메모리 최적화
   CurrentArrayFree();
//--- 화면에 현재 상태를 표시
   m_lbl_memory_available.Text("사용 가능한 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
   m_lbl_memory_used.Text("사용되는 메모리 = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
   m_lbl_array_size.Text("배열 크기 = 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("배열 유형 = char");
      if(m_combo_box_type_value==1)
         m_lbl_array_type.Text("배열 유형 = int");
      if(m_combo_box_type_value==2)
         m_lbl_array_type.Text("배열 유형 = float");
      if(m_combo_box_type_value==3)
         m_lbl_array_type.Text("배열 유형 = double");
      if(m_combo_box_type_value==4)
         m_lbl_array_type.Text("배열 유형 = 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);
  }