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

 

물론 내가 틀릴 수도 있지만 2개월 전에 내 템플릿이 작동했고 이제 CList 소멸자가 호출될 때 파괴되지 않은 개체 가 메모리에 남아 있는 것 같습니다. 코드:

 #property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public :
   int                x;
   double             y;
                     CData(){};
                     CData( int ival, double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template < typename T> class CDataBase
  {
private :
   CList            *mlist;
   T                *Tptr;
public :
   void CDataBase()           { mlist= new CList;                                    }
   void ~CDataBase( void )      { delete mlist;                                       }
   int ArraySize ( void )        { return (mlist.Total());                              }
   T * operator []( int index)   { return (mlist.GetNodeAtIndex(index));                }
   void   AddValue (T &value)  { Tptr = new T; Tptr  = value; mlist.Add(Tptr);       }
   string TypeName()          { return ( typename (T));                                }
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CDataBase<CData>*data= new CDataBase<CData>;
   int i;
   for (i= 0 ; i< 5 ; i++)
     {
      data.AddValue( new CData(i,i* 2.0 ));
     }

   for (i= 0 ; i<data. ArraySize (); i++)
     {
       Print (i, " : " ,data[i].x, " , " ,data[i].y);
     }
   Print (data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 0 : 0 , 0.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 1:1, 2.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 2:2, 4.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 3:3, 6.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 4:4, 8.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 씨데이터

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 5개의 삭제되지 않은 개체가 남음

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) CData 유형의 객체 5개 남음

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 280바이트의 메모리 누수

MT5 빌드 2085
 
Igor Makanu :

물론 내가 틀릴 수도 있지만 2개월 전에 내 템플릿이 작동했고 이제 CList 소멸자가 호출될 때 파괴되지 않은 개체 가 메모리에 남아 있는 것 같습니다. 코드:

 #property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public :
   int                x;
   double             y;
                     CData(){};
                     CData( int ival, double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template < typename T> class CDataBase
  {
private :
   CList            *mlist;
   T                Tptr;
public :
   void CDataBase()           { mlist= new CList;                                    }
   void ~CDataBase( void )      { delete mlist;                                       }
   int ArraySize ( void )        { return (mlist.Total());                              }
   T operator []( int index)   { return (mlist.GetNodeAtIndex(index));                }
   void   AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);      }
   string TypeName()          { return ( typename (T));                                }
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CDataBase<CData*>* data= new CDataBase<CData*>;
   int i;
   for (i= 0 ; i< 5 ; i++)
     {
      CData* Tmp = new CData(i,i* 2.0 );
      data.AddValue(Tmp);
     }

   for (i= 0 ; i<data. ArraySize (); i++)
     {
       Print (i, " : " ,data[i].x, " , " ,data[i].y);
     }
   Print (data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+
 
fxsaber :

예, 아마도 맞을 것입니다. 귀하의 예제는 올바르게 작동합니다. 어딘가에서 내 소스의 테스트 케이스를 혼합했습니다.

고맙습니다!

 
Вероника Сорокина :
안녕하세요. 그런 상황. mql4에서 작성한 어드바이저/스크립트/인디케이터/뭔가가 차트가 있는 창에 묶이지 않고 프로그램에 연결되어야 하는 것이 매우 필요합니다. 서비스(MT5에서)와 비슷하지만 MT4에서 필요합니다.

서비스 이용

 

ME에서 터미널의 즐겨찾기에 현재 코드를 추가할 수 있습니까?



사실, 현재 작성 및 테스트 중인 코드를 추가할 수 있는 별도의 "디버그" 탭을 갖고 싶습니다.

이제 편리한 작업을 위해 현재 프로젝트 와 관련이없는 모든 것이 누락 된 별도의 터미널을 시작해야한다는 것이 밝혀졌습니다.

그러면 디버깅이 훨씬 빨라집니다. 터미널 자체의 다른 코드에서 리플이 발생하지 않습니다.

 

친애하는 개발자. 표시기 버퍼의 자동 재매핑이 정상인지 확인하십시오. 다시 파티션한다는 것은 다음을 의미합니다. 버퍼 크기 + rate_total은 크기가 6439일 때 5000으로 재설정됩니다. 창의 막대 = 10000. 재설정은 11439에서 발생합니다.

이 때문에 표시기가 충돌하고 잘못된 데이터를 표시할 수 있습니다.

빌드 2085. 2000년대 빌드의 어딘가에서 이 동작을 발견했습니다.

 
Alexey Kozitsyn :

친애하는 개발자. 표시기 버퍼의 자동 재매핑이 정상인지 확인하십시오. 다시 파티션한다는 것은 다음을 의미합니다. 버퍼 크기 + rate_total은 크기가 6439일 때 5000으로 재설정됩니다. 창의 막대 = 10000. 재설정은 11439에서 발생합니다.

이 때문에 표시기가 충돌하고 잘못된 데이터를 표시할 수 있습니다.

빌드 2085. 2000년대 빌드의 어딘가에서 이 동작을 발견했습니다.

상위 5위 안에 드는 이러한 행동은 원래 있었습니다.

버퍼 재할당으로 인한 표시기 충돌의 예를 제시하십시오.

 
Slava :

상위 5위 안에 드는 이러한 행동은 원래 있었습니다.

버퍼 재할당으로 인한 표시기 충돌의 예를 제시하십시오.

저것들. 표준보다 높은 1439개의 막대가 누적되면 터미널 FORCED가 버퍼 크기를 max 값으로 재설정한다는 것을 확인합니다. 창에 막대? 예인 경우 문서에 지정해야 합니다. 왜냐하면 이것은 예기치 않은 동작입니다.

예에 관해서. 막대 번호와 함께 작동하는 사용자 정의 개발을 의미합니다. 저것들. 막대 번호 6438을 기억하고 2분(TF M1) 후 버퍼가 재분배되고 어레이가 한계를 벗어났습니다. 이제 이것이 "표준" 동작이라는 것이 분명합니다. 문서를 업데이트하십시오.

 

실행 중 오류:

 class A { public :
         virtual void f( int = 0 ) { Print ( 1 ); }
};
class B : public A { public :
         virtual void f( int     ) { Print( 2 ); }
};
void OnStart ()
{
        B b;
        b.f();
}

결과 : 1

예상: 2 또는 (C++에서와 같이) - 컴파일 오류

 
Alexey Kozitsyn :

문서를 업데이트하십시오.

문서는 어디에서 업데이트해야 합니까?

막대의 명확한 식별자는 항상 숫자가 아니라 막대의 시간이었습니다.

차트에서 누군가 ChartSetSymbolPeriod라고 부르는 경우 막대 수의 변화를 쉽게 포착할 수 있습니다. 놀라다?

그건 그렇고, OnCalculate에는 이러한 매개변수 rate_total이 있습니다.