오류, 버그, 질문 - 페이지 2296

 
A100 :

문제가 없습니다... 버그가 있습니다. 왜 귀로 설명을 들으려고 하는지 나도 이해가 안 된다. 일반 인쇄에는 다음 서명이 있습니다.

또한 다른 기능과 충돌하는 방법을 알고 있습니다(필요한 경우).

인쇄 서명은 MQL5 언어의 기능 이상입니다. MQL5가 인쇄 오버로드를 전혀 금지한다면 그것은 실수가 아닐 것입니다.

이 "버그"가 차량 생성을 방해하지 않고 목발을 쓸 필요가 없기를 바랍니다.

 

테스터의 성능을 측정했습니다. 이를 위해 각 틱에서 포지션을 열고 닫았습니다. 100틱의 실행 시간을 측정했습니다. 그래서 100,000틱을 운전했습니다. 총 1000회 측정. 이 차트를 얻었다

서로 거의 같은 거리에서 일부 감속 버스트. 최적화 모드에서 측정되었습니다. 버스트에 주의를 기울이지 않으면 테스터의 성능이 상수 값 대신 25%만큼 춤을 춥니다. 아마도 이것은 다시 Windows의 속도 측정 농담일 것입니다.


위협 MT4에서 시작된 동일한 코드

평균적으로 MT4-Tester는 MT5보다 1틱을 처리하는 데 1.5-2배 적은 시간을 소비합니다.

파일:
Tester.mq5  2 kb
 

아마도 유전자 최적화 알고리즘 의 사용을 통해 폭발할 것입니다.


... 각 틱에서 포지션을 열고 닫았습니다.

평균적으로 MT4-Tester는 MT5보다 1틱을 처리하는 시간이 1.5-2배 적습니다.
그리고 이것은 순수한 조작이며 허위 진술입니다.
 
Sergey Dzyublik :

아마도 유전자 최적화 알고리즘 의 사용을 통해 폭발할 것입니다.

GA는 그렇지 않습니다. 하나의 에이전트에서 2개의 패스를 통한 최적화.

그리고 이것은 순수한 조작이며 허위 진술입니다.

소스가 제자리에 있습니다.

 

하나는 경고이고 다른 하나는 오류입니다.

 void f()
{
     for ( int i = 0 ;; )
    {
        Print ( i );
         int     i = 5 ; //Warning: declaration of 'i' hides local declaration
         Print ( i );
         break ;
    }
}
void For( int i = 0 )
    {
         Print ( i );
         int     i = 5 ; //Error: redefinition of formal parameter 'i'
         Print ( i );
    }

그리고 근본적인 차이점은 무엇입니까? 예를 들어 C++에서 두 경우 모두 오류는 다음과 같습니다.

 

지식이 있는 사람들이 클래스 인스턴스에 대한 포인터 문제를 이해할 수 있도록 도움을 요청합니다. 그리고는 들어가지 않습니다.

다음 예제 스크립트가 있습니다.

 class A
  {
public :
                     A() { Print ( "Start" ); };
                    ~A() { 
                     Print ( "End" ); 
                     Print ( EnumToString ( CheckPointer ( GetPointer ( this )))); 
                     if ( CheckPointer ( GetPointer ( this ))!= POINTER_DYNAMIC ) 
                     delete GetPointer ( this );};
  };
  
A a;

void OnStart ()
  {
  }

실행되면 예상한 대로 다음이 수행됩니다.

 2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


다음과 같이 클래스의 인스턴스를 선언하면:

A *a= new A;

그런 다음 실행될 때 다음이 있습니다.

 2018.09 . 23 21 : 46 : 42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

저것들. 소멸자가 시작되지도 않았고 그에 따라 메모리가 해제되지도 않습니다.


다음과 같이 클래스의 인스턴스를 선언하면:

A a= new A;

그런 다음 생성자는 두 번 실행되고 소멸자는 한 번 실행되지만 메모리가 해제되지 않고 POINTER_DYNAMIC이 예상 되었지만 객체 포인터 유형이 POINTER_AUTOMATIC 입니다.

 2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09 . 23 21 : 54 : 24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09 . 23 21 : 54 : 24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


소멸자가 항상 실행되고 올바른 삭제 실행을 보장하는 방법

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


C++의 스마트 포인터 주제를 참조하고 MQL에 적응하십시오( https://habr.com/post/140222/ ).
아마도 코드베이스에 뭔가가...

 
Sergey Dzyublik :


C++의 스마트 포인터 주제를 참조하고 MQL에 적응하십시오( https://habr.com/post/140222/ ).
아마도 코드베이스에 뭔가가...

감사합니다. 하지만 거기에서 내 질문에 대한 답변을 보지 못했습니다.
A *a= new A일 때 소멸자가 호출되지 않는 이유를 이해할 수 없습니다.

 
Nikolai Semko :

감사합니다. 하지만 거기에서 내 질문에 대한 답변을 보지 못했습니다.
A *a= new A일 때 소멸자가 호출되지 않는 이유를 이해할 수 없습니다.

그런 다음 다음과 같이 시도하십시오.
 class A { public :
         A() { Print ( 1 , ":" , EnumToString ( CheckPointer ( GetPointer ( this )))); }
        ~A() { Print ( 2 , ":" , EnumToString ( CheckPointer ( GetPointer ( this )))); }
};
class B { public :
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
         void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart () {}

결과:

1:POINTER_AUTOMATIC
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMATIC

 
Nikolai Semko :

감사합니다. 하지만 거기에서 내 질문에 대한 답변을 보지 못했습니다.
A *a= new A일 때 소멸자가 호출되지 않는 이유를 이해할 수 없습니다.

new 연산자로 생성하고 delete 연산자로 삭제