기고글 토론 "MQL5의 객체 생성 및 파괴 순서"

 

새로운 기고글 MQL5의 객체 생성 및 파괴 순서 가 게재되었습니다:

사용자 지정 개체, 동적 배열 또는 개체 배열 등 모든 개체는 특정 방식으로 MQL5 프로그램에서 생성 및 삭제됩니다. 종종 일부 개체는 다른 개체의 일부이며 초기화 해제시 개체 삭제 순서가 특히 중요합니다. 이 글에서는 개체 작업 메커니즘을 다루는 몇 가지 예를 제공합니다.

MQL5 프로그램은 객체 지향 프로그래밍 (OOP) 개념으로 작성되었으며 사용자 정의 라이브러리를 만들 수 있는 새로운 가능성을 열어 줄 뿐만 아니라 다른 개발자의 완전하고 테스트된 클래스를 사용할 수 있도록 해줍니다. MetaTrader 5 클라이언트 터미널에 포함된 표준 라이브러리에는 수천 개의 메소드를 포함하는 수백 개의 클래스가 있습니다.

OOP를 최대한 활용하려면 개체를 만들고 삭제하는 방법에 대한 몇 가지 세부 정보를 MQL5 프로그램에서 명확히 해야 합니다. 객체 생성 및 삭제는 문서에 간략하게 설명되어 있으며 이 글에서는 이 주제를 예제로 설명합니다.

작성자: MetaQuotes

 
Yedelkin:

LocalVar_TestScript_2.mq5를 처음 실행하면 다음과 같은 정보만 제공합니다.

즉,"잘못된 포인터 삭제"라는 메시지가 표시되지 않습니다. 동일한 파일을 다시 컴파일한 후(즉, 두 번째 컴파일 후) 이 메시지가 표시됩니다:

잘못된 포인터 삭제에 대한 터미널의 반응이 문서가 게시된 이후 변경되었나요? XP, 32
메시지를 보내 주셔서 감사합니다. 수정했습니다. 동작이 변경되어 이제디버깅을 위해 컴파일할 때만 "유효하지 않은 포인터 삭제" 메시지가생성됩니다.
 

mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.

좋아요, 해당 기사에 대한 설명을 보고 싶습니다.
 

이 줄로 인해 생성자가 실행되는 이유는 무엇인가요?

 CItem* array1[5];

그리고 이것은 그렇지 않습니다:

CObjectC *pObjectC;
?
 
새 연산자는 클래스를 동적으로 만드는 데만 필요하나요? 하지만 동적 배열이 "첫 번째 대괄호 쌍에 지정되지 않은 값이 있는 배열"이라면 동적 클래스란 무엇일까요?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

이 줄로 인해 생성자가 호출되는 이유:

확인했는데 생성자 호출이 이루어지지 않습니다, 전체 코드를 첨부 해주세요.
 
Burgunsky:

그리고 이 줄로 인해 생성자가 실행되는 이유: CItem* array1[5];,

는 실행되지만, 이 줄은 실행되지 않습니다: CObjectC *pObjectC; ?

나는 그 줄을 이해했다

CItem* array1[5];

라인만으로는 생성자가 실행되지 않는다는 것을 이해했습니다. 다음은 기사에서 더 완전한 코드입니다:

void OnStart()
  {
//--- 객체에 대한 첫 번째 포인터 배열을 선언합니다.
   CItem* array1[5];
//--- 객체에 대한 두 번째 포인터 배열을 선언합니다.
   CItem* array2[5];
//--- 이제 루프에서 배열을 채워 보겠습니다.
   for(int i=0;i<5;i++)
     {
      //--- 첫 번째 배열에 대한 포인터는 연산자 new에 의해 생성됩니다.
      array1[i]=new CItem;
      //--- 두 번째 배열에 대한 포인터가 첫 번째 배열에서 복사됩니다.
      array2[i]=array1[i];
     }
생성자는 첫 번째 포인터 배열을 선언할 때가 아니라 연산자를 사용하여 이 배열을 루프에서 채울 때 호출됩니다.
 
Burgunsky:
새 연산자는 클래스를 동적으로 만드는 데만 필요하나요? 하지만 동적 배열이 "첫 번째 대괄호 쌍에 지정되지 않은 값을 가진 배열"이라면 동적 클래스란 무엇인가요?
프로그래밍에서 "동적"이라는 단어는 다의적이라는 것을 이해했습니다. 클래스와 관련해서는 "자동으로 생성된 객체"와 "동적으로 생성된 객체"라는 대립되는 개념이 있습니다. 이 둘의 차이는 전역 수준에서 선언된 변수와 로컬 수준에서 선언된 변수 사이의 차이와 거의 같습니다. 즉, "동적으로 생성된 객체"는 "잠시 동안" 생성되는 객체로, 수명은 새 연산자에 의해 생성되는 순간부터 삭제 연산자에 의해 삭제되는 순간까지입니다.
 

하지만 여전히 의문이 남습니다:

새 연산자를 통해 동적 객체를 생성하는 이유는 무엇인가요?

객체를 자동으로 생성할 때 클래스 객체는 스택에 생성되며, 실행 시간 측면에서 동적 객체보다 빠릅니다.

동적으로 객체를 생성할 때는 OS 메모리 관리자를 사용하는 동안 클래스 객체가 메모리(힙에)에 생성되므로 프로세스가 느려집니다.

자동 생성이 더 빠르다면 왜 동적 객체를 생성할까요? 스택이 넘쳐나는 것을 방지하기 위해서일까요?

 
이제 첨부된 소스 코드 파일과 HTML 코드에 삽입된 소스 코드가 사용자의 편의를 위해 포르투갈어로 완전히 번역됩니다.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 

شكرا جزيلا