mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 217

 
fxsaber # :
복잡한 구조를 무효화하려면 이제(b3110) 어떻게 해야 합니까?

nullable 생성자.

그리고 작동 중에 재설정해야 하는 경우 추가하십시오. 이를 위한 방법:

 struct MqlTick2 : private MqlTick
{
         string Str; // С этой строкой не обнулить.

        MqlTick2()
        {
                Init();
        }
         void Init()
        {
                Str = NULL ;
        };
};

void OnStart ()
{
        MqlTick2 tick;
         Print ( tick.Str );  // NULL
        tick.Str = "123" ;
         Print ( tick.Str );  // "123"
        tick.Init();
         Print ( tick.Str );  // NULL
}
 
Andrey Khatimlianskii # :

nullable 생성자.

그리고 작동 중에 재설정해야 하는 경우 추가하십시오. 이를 위한 방법:

ZeroMemory가 한 번 허용한 대로 보편적인 방법을 원합니다.

 
A100 # :

변경된 사항을 고려하십시오. 이제 첫 번째 구성원이 0 x[i].i == 0과 같은지 확인합니다(이전 조건은 x[i].x == 0.0).

결과: 거짓

그리고 ZeroMemory와 함께 - 사실

감사합니다. 수정했습니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

mktr8591 , 2021.08.12 19:43

이제 지연 제한을 설정하고 있습니다. 그런 다음 내 손으로 변경하고 스크립트와 ORDER_TIME_SETUP 을 변경합니다.

변경 사항의 예입니다.

전시 로그.

QG      0       22:00:02.376    Trades  '93912': accepted buy limit 13.1 AUDUSD at 0.71897 tp: 0.71927
IS      0       22:00:02.378     Trades  '93912': order # 5774292 buy limit 13.1 / 13.1 AUDUSD at 0.71897 done in 33.487 ms

ORDER_TIME_SETUP 이 변경 됩니다. 벌레?

 
fxsaber # :

ZeroMemory가 한 번 허용한 대로 보편적인 방법을 원합니다.

그리고 누가 문자열의 버퍼를 해제할까요? 실제로 ZeroMemory는 이것과 유사합니다.

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)

소멸자는 호출되지 않습니다. 따라서 버퍼에 대한 포인터가 문자열로 재설정되고 버퍼 자체가 누수됩니다. 기억에 대한 직접 작업은 지뢰밭과 같아서 약간의 경계를 잃었습니다.

귀하의 사례에 대한 누출 예시:

 #include <iostream>
#include < string >
#include <cstring>

int main()
{
    std:: string example{ "Leaked memory!!!" };
    std::cout<< "First: " <<example<<std::endl;
     const char * data=example.data();
    std::memset(&example, 0 , sizeof (example));
    std::cout<< "Second: " <<example<<std::endl;
    std::cout<< "Third: " <<data<<std::endl;
     return 0 ;
}
First: Leaked memory!!!
Second: 
Third: Leaked memory!!!

객체는 더 이상 버퍼에 대한 포인터를 소유하지 않으며 버퍼 자체는 "누수"됩니다.

추신. 음, memset 및 ZeroMemory를 통해 POD 유형을 재설정하는 것은 불가능합니다.

 
Vladimir Simakov # :

추신. 음, memset 및 ZeroMemory 를 통해 POD 유형을 재설정하는 것은 불가능합니다.

확인하지 않았지만 문자열 버퍼가 0으로 설정된 것 같습니다.

 
fxsaber # :

확인하지 않았지만 문자열 버퍼가 0으로 설정된 것 같습니다.

그리고 무엇에서 무효화됩니까?)))

 #import "CPPTestDll.dll"
         long GetAddress( string &ptr);
         string Text( long data);
#import

struct A{
   string a;
   int b;
};

void OnStart ()
{
   string t1= "Test" ;
   string t2= "text" ;
   Print (t1);
   Print (t2);
  A a={ "" , 8 };
  a.a+=t1+ " " +t2;
   long ptr=GetAddress(a.a);
   Print (a.a, " | " ,a.b);
   Print (Text(ptr));
   Print ( "-------------------------" );
   ZeroMemory (a);
   Print (a.a, " | " ,a.b);
   Print (Text(ptr));
}


 2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        Test
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        text
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        Test text | 8
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        Test text
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        -------------------------
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)         | 0
2021.11 . 28 14 : 49 : 29.354 test (EURUSD,H4)        Test text

여기에있는 모든 것은 성인입니다 .)))

UPD: t1, t2 출력과 함께 컴파일러가 이 모든 것을 최적화하지 않도록 함)

UPD2: 물론, 버퍼에 대해 delete를 호출할 수도 있지만, 나는 그런 식으로 곧바로 구조체 내부의 문자열이 완료된 경우에 대해 어떻게 하는지 알 수 없습니다.

UPD3: 도움이 개인적으로 호출된다고 나와 있지만 버퍼를 해제해야 한다는 뜻입니다. 포인터에서 이미 해제된 메모리에 대한 데이터를 읽기를 바랍니다.

파일:
 
Vladimir Simakov # :

그리고 무엇에서 무효화됩니까?)))

보는 것이 좋을 것입니다.

 Print (GetAddress(a.a));

이전과 이후.

 
fxsaber # :

보는 것이 좋을 것입니다.

이전과 이후.

예상대로. 첫 번째 경우 메모리 주소, 두 번째 0

 
Vladimir Simakov # :

그리고 무엇에서 무효화됩니까?)))


여기에있는 모든 것은 성인입니다 .)))

UPD: t1, t2 출력과 함께 컴파일러가 이 모든 것을 최적화하지 않도록 함)

UPD2: 물론, 버퍼에 대해 delete를 호출할 수도 있지만, 나는 그런 식으로 곧바로 구조체 내부의 문자열이 완료된 경우에 대해 어떻게 하는지 알 수 없습니다.

UPD3: 도움이 개인적으로 호출된다고 나와 있지만 버퍼를 해제해야 한다는 뜻입니다. 포인터에서 이미 해제된 메모리에 대한 데이터를 읽기를 바랍니다.

원칙적으로 모든 것은 구현에 있어 아주 사소한 것이어야 합니다)

사유: