Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 217

 
fxsaber # :
Şimdi (b3110) karmaşık bir yapı nasıl geçersiz kılınır?

null oluşturucu.

Ve işlem sırasında sıfırlamanız gerekirse, ayrıca ekleyin. bunun için yöntem:

 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 # :

null oluşturucu.

Ve işlem sırasında sıfırlamanız gerekirse, ayrıca ekleyin. bunun için yöntem:

ZeroMemory'nin bir zamanlar izin verdiği gibi evrensel bir yol istiyorum.

 
A100 # :

Neyin değiştiğini düşünün - şimdi 1. üyenin sıfıra eşit olup olmadığını kontrol ediyorum x[i].i == 0 (önceden koşul x[i].x == 0.0 idi)

sonuç: yanlış

Ve ZeroMemory ile - doğru

Teşekkürler, düzelttim.

 

Neyin değiştiğine bir örnek.

Sergi günlüğü.

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 değişiklikleri . Böcek?

 
fxsaber # :

ZeroMemory'nin bir zamanlar izin verdiği gibi evrensel bir yol istiyorum.

Ve dizideki arabelleği kim serbest bırakacak? ZeroMemory, aslında, bunun bir analogudur.

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

Hiçbir yıkıcı çağrılmayacak. Buna göre, arabelleğe işaretçi dizede sıfırlanacak ve arabelleğin kendisi sızdıracaktır. Bellekle doğrudan çalışma bir mayın tarlası gibidir, biraz dikkatimi kaybettim ve o kadar)))

Davanız için örnek bir sızıntı:

 #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!!!

Nesne artık arabelleğe yönelik işaretçiye sahip değil ve arabelleğin kendisi "sızdırılmış".

not. POD türlerini memset ve ZeroMemory aracılığıyla sıfırlamak mümkün değil

 
Vladimir Simakov # :

not. POD türlerini memset ve ZeroMemory aracılığıyla sıfırlamak mümkün değil

Kontrol etmedim, ancak dize arabelleğinin sıfıra ayarlandığını düşünüyorum.

 
fxsaber # :

Kontrol etmedim, ancak dize arabelleğinin sıfıra ayarlandığını düşünüyorum.

Ve neyden geçersiz kılınacak?)))

 #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

Buradaki her şey yetişkin olması gerektiği gibi)))

UPD: t1, t2 çıktılarıyla birlikte, böylece derleyici her şeyi optimize etmez)

UPD2: Tabii ki, arabellek için silme diyor olabilirler, ancak ben, bunun gibi, yarasadan hemen sonra, yapının içindeki dize yapıldığında durum için nasıl yaptıklarını çözemiyorum.

UPD3: Yardım, kişisel olarak bunun için çağrıldığını söylese de, bu, arabelleğin serbest bırakılması gerektiği anlamına gelir, umarım verileri işaretçiden zaten boş belleğe okurum.

Dosyalar:
 
Vladimir Simakov # :

Ve neyden geçersiz kılınacak?)))

görmek güzel olurdu

 Print (GetAddress(a.a));

Önce ve sonra.

 
fxsaber # :

görmek güzel olurdu

Önce ve sonra.

Beklenildiği gibi. İlk durumda, ikinci durumda bellek adresi 0

 
Vladimir Simakov # :

Ve neyden geçersiz kılınacak?)))


Buradaki her şey yetişkin olması gerektiği gibi)))

UPD: t1, t2 çıktılarıyla birlikte, böylece derleyici her şeyi optimize etmez)

UPD2: Tabii ki, arabellek için silme diyor olabilirler, ancak ben, bunun gibi, yarasadan hemen sonra, yapının içindeki dize yapıldığında durum için nasıl yaptıklarını çözemiyorum.

UPD3: Yardım, kişisel olarak bunun için çağrıldığını söylese de, bu, arabelleğin serbest bırakılması gerektiği anlamına gelir, umarım verileri işaretçiden zaten boş belleğe okurum.

Prensip olarak, uygulamada her şey oldukça önemsiz olmalıdır)