Особенности языка mql5, тонкости и приёмы работы - страница 217

 
fxsaber #:
Как теперь (b3110) обнулить непростую структуру?

Конструктор с обнулением.

А если нужно обнулить в процессе работы, то еще и доп. метод для этого:

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

Конструктор с обнулением.

А если нужно обнулить в процессе работы, то еще и доп. метод для этого:

Хотелось бы универсальный способ, как когда-то позволял ZeroMemory.

 
A100 #:

Считайте что поменял - теперь проверяю 1ый член на равенство нулю x[i].i == 0 (ранее условие было x[i].x == 0.0)

Результат: false

А с ZeroMemory - true

Спасибо, исправил.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка 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.

А буфер в string кто освобождать будет? ZeroMemory, по сути является аналогом этого.

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

Никакие деструкторы вызываться не будут. Соответственно в string обнулится указатель на буфер, а сам буфер утечет. Прямая работа с памятью - это как минное поле, чуть бдительность потерял и все)))

Пример утечки для твоего случая:

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

Объект больше не владеет указателем на буфер, а сам буфер "утек".

PS. Ну его нафиг не POD типы обнулять через memset и ZeroMemory

 
Vladimir Simakov #:

PS. Ну его нафиг не POD типы обнулять через memset и ZeroMemory

Не проверял, но думаю, строковый буфер обнуляется.

 
fxsaber #:

Не проверял, но думаю, строковый буфер обнуляется.

А с какого такого ему обнуляться?)))

#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 для буфера, но я, вот так с ходу, не могу придумать, как они это для случая, когда string внутри структуры сделать

UPD3: хотя в справке написано, что для него персонально вызывается, значит должны буфер освобождать, это я, надеюсь, что по указателю на освобожденную уже память данные считываю.

Файлы:
 
Vladimir Simakov #:

А с какого такого ему обнуляться?)))

Хорошо бы посмотреть

Print(GetAddress(a.a));

До и после.

 
fxsaber #:

Хорошо бы посмотреть

До и после.

Как и положено. В первом случае адрес памяти, во втором 0

 
Vladimir Simakov #:

А с какого такого ему обнуляться?)))


Тут все по взрослому, как и должно быть)))

UPD: t1, t2 с их выводом, для того, что бы компилятор это дело все не заоптимизировал)

UPD2: оно конечно может быть они и вызывают delete для буфера, но я, вот так с ходу, не могу придумать, как они это для случая, когда string внутри структуры сделать

UPD3: хотя в справке написано, что для него персонально вызывается, значит должны буфер освобождать, это я, надеюсь, что по указателю на освобожденную уже память данные считываю.

В принципе там все достаточно тривиально в реализации должно быть)

Причина обращения: