앗. 지원 질문 - 페이지 13

 
TheXpert :
불일치가 없도록 예를 보여 주시면 답변 드리겠습니다.

 //1-ый вариант. Переменная-член strA инициализируется автоматически
class A
  {
public :
   string             strA;
                     A( void ) { Print ( "strA=" ,strA); };
                    ~A( void ){};
  };
//2-ой вариант. Переменная-член strB инициализируется при помощи инициализатора пользовательским значением
class B
  {
public :
   string             strB;
                     B( const string str) : strB(str) { Print ( "strB=" ,strB); }
                    ~B( void ){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   A a1;
   B b1( "Пользовательское значение" );
  }

예는 간단합니다. a1.strA 멤버의 자동 초기화에 15개의 "컴퓨터 주기"가 사용되었다고 가정해 보겠습니다. b1.strB 멤버의 초기화에도 15주기가 소요된다는 예비 결론에 도달했습니다. 맞나요?

 

표준 라이브러리CExpert 클래스에는 이러한 보호 선언이 있습니다.

 //--- trading objects
CExpertTrade     *m_trade;     // trading object
CExpertSignal    *m_signal;   // trading signals object
CExpertMoney     *m_money;     // money manager object
CExpertTrailing  *m_trailing; // trailing stops object

동시에 이 객체의 생성자에는 다음 줄이 포함되어 있습니다.

m_trade    = NULL ;
m_signal   = NULL ;
m_money    = NULL ;
m_trailing = NULL ;

내 클래스에서 비슷한 것을 정렬하려고 했지만 추가 초기화 없이 (Init 및 InitXXX의 예를 따름) .

컴파일러는 경고와 오류 없이 모든 것을 컴파일했지만 EA가 차트에 설치되었을 때 심각한 오류 281 (Invalid pointer access )이 발생하고 EA가 차트에서 제거되었습니다.

이와 관련하여 다음과 같은 질문이 제기되었습니다.

1. 생성자에서 해야 할 올바른 일은 무엇입니까(NULL을 지정하거나 특정 개체에 대한 포인터를 즉시 작성하여)?

2. InitTrade 유형 포인터의 후속 초기화가 필수입니까?

 
Interesting :

표준 라이브러리CExpert 클래스에는 이러한 보호 선언이 있습니다.

동시에 이 객체의 생성자에는 다음 줄이 포함되어 있습니다.

내 클래스에서 비슷한 것을 정렬하려고 했지만 추가 초기화 없이 (Init 및 InitXXX의 예를 따름) .

컴파일러는 경고와 오류 없이 모든 것을 컴파일했지만 EA가 차트에 설치되었을 때 심각한 오류 281 (Invalid pointer access )이 발생하고 EA가 차트에서 제거되었습니다.

이와 관련하여 다음과 같은 질문이 제기되었습니다.

1. 생성자에서 해야 할 올바른 일은 무엇입니까(NULL을 지정하거나 특정 개체에 대한 포인터를 즉시 작성하여)?

2. InitTrade 유형 포인터의 후속 초기화가 필수입니까?

1. 그렇군요. 그것은 모두 클래스의 특정 구현에 따라 다릅니다(특히 CExpert 가 아님). 그러나 bool 을 반환하는 InitXXX 메서드에서 동적 개체를 만드는 것이 좋습니다(생성자가 실행 결과를 반환하지 않고 후속 분석에서 초기화 플래그를 설정/재설정해야 하기 때문입니다).

2. 물론 필요합니다. 그렇지 않으면 심각한 오류 281 (잘못된 포인터 액세스 )입니다.

추신. 그건 그렇고, 감사합니다. 사용하기 전에 포인터 검사를 삽입해야 합니다.

 
Yedelkin :

예는 간단합니다. a1.strA 멤버의 자동 초기화에 15개의 "컴퓨터 주기"가 사용되었다고 가정해 보겠습니다. b1.strB 멤버의 초기화에도 15주기가 소요된다는 예비 결론에 도달했습니다. 맞나요?

아니요, 비트에 관한 것이 아닙니다. 글쎄, 아니면 꽤 사이클이 아닙니다.
 
TheXpert :
아니요, 비트에 관한 것이 아닙니다. 글쎄, 아니면 꽤 사이클이 아닙니다.

자, 그러면 아주 간단한 질문입니다. 위의 예에서 a1.strA 멤버와 b1.strB 멤버 중 어느 것이 시간에 맞춰 초기화하는 것이 더 빠릅니까?

또는 "pointwise"로 무엇을 읽을까요? 물리적으로 "머신 프로세서" 수준에서 프로그래밍을 공부할 방법은 없습니다.

 
Yedelkin :

자, 그러면 아주 간단한 질문입니다. 위의 예에서 a1.strA 멤버와 b1.strB 멤버 중 어느 것이 시간에 맞춰 초기화하는 것이 더 빠릅니까?

또는 "pointwise"로 무엇을 읽을까요? 물리적으로 "머신 프로세서" 수준에서 프로그래밍을 공부할 방법은 없습니다.

a1.strA는 초기화 프로세스가 제자리에서 간단한 0으로 구성되기 때문에 더 빨리 초기화됩니다. b1.strB에 메모리가 할당됩니다.

그러나 이 차이는 초기화 주변의 코드를 고려하면 1%보다 훨씬 적기 때문에 측정하기가 매우 어렵습니다.

 
Yedelkin :

초기화하는 것이 더 빠릅니다.

질문이 잘못되었습니다.
 
stringo :

b1.strB에 메모리가 할당됩니다.

감사합니다. 제 논리에 누락된 링크가 있습니다.

Xpert님 , 도움을 주셔서 감사합니다. 나는 문제의 본질을 내 자신의 말로 설명하려고 노력했다. 나는 그 주제에 있는 사람들이 진정으로 올바른 질문을 한다는 것에 동의합니다. 그러나 그들은 일반적으로 내 수준의 질문을하지 않습니다 :)

 
uncleVic :

1. 그렇군요. 그것은 모두 클래스의 특정 구현에 따라 다릅니다(특히 CExpert 가 아님). 그러나 bool 을 반환하는 InitXXX 메서드에서 동적 개체를 만드는 것이 좋습니다(생성자가 실행 결과를 반환하지 않고 후속 분석에서 초기화 플래그를 설정/재설정해야 하기 때문입니다).

2. 물론 필요합니다. 그렇지 않으면 심각한 오류 281 (잘못된 포인터 액세스 )입니다.

추신. 그건 그렇고, 감사합니다. 사용하기 전에 포인터 검사를 삽입해야 합니다.

감사합니다. 이제 모든 것이 제자리에 있습니다. 그러나 추가 질문이 있습니다. 오류 281이 발생한다고 가정 해 봅시다. 그러나 어드바이저가 언로드되지 않는 것이 바람직합니다. 그러면 어떻게 될까요?

질문을 명확히 하겠습니다. 모든 초기화 단계가 완료된 후 281번째 오류가 발생했지만 이것이 Expert Advisor의 주요 작업에 너무 치명적이어서 전혀 실행되지 않는 경우에는 어떻게 됩니까?

 
Interesting :

오류 281이 발생한다고 가정해 보겠습니다. 하지만 어드바이저가 언로드되지 않는 것이 바람직합니다. 그러면 어떻게 될까요?

질문을 명확히 하겠습니다. 모든 초기화 단계가 완료된 후 281번째 오류가 발생했지만 이것이 Expert Advisor의 주요 작업에 너무 치명적이어서 전혀 실행되지 않는 경우에는 어떻게 됩니까?

" 유효하지 않은 포인터 접근 " == " 유효하지 않은 포인터 접근을 시도했습니다"? 그렇다면

유효하지 않은 포인터에 액세스하려는 시도프로그램심각한 종료 로 이어집니다. 따라서 포인터를 사용하기 전에 CheckPointer() 함수를 사용할 필요가 있습니다. 다음과 같은 경우 포인터가 유효하지 않을 수 있습니다.

  • 포인터가 NULL 입니다.
  • 객체가 삭제 연산자를 사용하여 파괴된 경우.