Ошибки, баги, вопросы - страница 2571

Artyom Trishkin:

Если в недословном переводе, то: "2 строки вызывают утечку памяти".

А дословно - примерно так: остались 2 текущие строки.

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

Roman:

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

Течет. Память под строки выделяется, байты копируются, а  память не чистится.

Исходники есть?

Разрабам респект за менеджер памяти, что такое отслеживает.

Vladimir Simakov:

Течет. Память под строки выделяется, байты копируются, а  память не чистится.

Исходники есть?

Разрабам респект за менеджер памяти, что такое отслеживает.

Да вроде в библиотеке, в методе класса Deserialize, вызывается Clear ();

virtual bool Deserialize (string js, int acp = CP_ACP)
{
   int i = 0;
   Clear ();
   CJAVal::code_page = acp;
   char arr [];
   int slen = StringToCharArray (js, arr, 0, WHOLE_ARRAY, CJAVal::code_page);
   return Deserialize (arr, slen, i);
}

Исходник от сюда брал.

Roman:

Да вроде в библиотеке, в методе класса Deserialize, вызывается Clear ();

Исходник от сюда брал.

Течет не там, а, скорее всего, в той dll, из которой строку получаете.

[Удален]
Roman:

Да вроде в библиотеке, в методе класса Deserialize, вызывается Clear ();

Исходник от сюда брал.

Как CJVal создаёте? наверное new CJVal()?

Течет не там, а, скорее всего, в той dll, из которой строку получаете.

Вряд ли терминал такое отлавливает.
Vladimir Simakov:

Течет не там, а, скорее всего, в той dll, из которой строку получаете.

У меня тоже сложилось такое впечатление, что течёт та функция которая читает данные.
Данные она сперва буферизует, потом передаёт, после передачи по словам разработчика либы, буфер очищается.
Но видимо есть косяк в очистке этого буфера.
Но что интересно, если не десериализовать строку в скрипте, то утечки нет, то есть проблема наступает в момент десериализации в скрипте.
Просто проверяю разные варианты возможной причины.
Исходников к сожалению нет, так как закрытая либа .lib

Vict:

Как CJVal создаёте? наверное new CJVal()?

Вряд ли терминал такое отлавливает.

Нет, как в примере автора библы, на стек

CJAVal js(NULL, jtUNDEF);

Обнаружил, что у меня в режиме визуального тестирования функция SymbolInfoTick() возвращает одно значение, а таймсерия Close[0] имеет другое.

Это ошибка моя ? Я что-то делаю не так ?

Вроде как должны быть одинаковые значения:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

   MqlTick mtLastTick;
   SymbolInfoTick(Symbol(),mtLastTick);
   
   ArraySetAsSeries(close,true);


   Comment("Close[0] = " + DoubleToString(close[0],5) + "\nLastBid = " + DoubleToString(mtLastTick.bid,5));
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Как правило, разница составляет 1-2 пункта, но на резких движениях бывает и больше. 

Это только у меня так ?

Пока что принял таймсерию за "более правильную", если выясняется, что SymbolInfoTick() дает значение, отличающееся от Close[0], считаю, что правильное значение - именно Close[0], спред оставляю тот же, что вернуло SymbolInfoTick().

Но, все же интересно понять, какая цена правильна, на какую цену "смотрит" ДЦ - на SymbolInfoTick() или на Close[0]

Файлы:
TestTick.mq5  2 kb
Georgiy Merts:

Обнаружил, что у меня в режиме визуального тестирования функция SymbolInfoTick() возвращает одно значение, а таймсерия Close[0] имеет другое.

Это ошибка моя ? Я что-то делаю не так ?

Вроде как должны быть одинаковые значения:

Как правило, разница составляет 1-2 пункта, но на резких движениях бывает и больше. 

Это только у меня так ?

Пока что принял таймсерию за "более правильную", если выясняется, что SymbolInfoTick() дает значение, отличающееся от Close[0], считаю, что правильное значение - именно Close[0], спред оставляю тот же, что вернуло SymbolInfoTick().

Но, все же интересно понять, какая цена правильна, на какую цену "смотрит" ДЦ - на SymbolInfoTick() или на Close[0]

Еще есть SymbolInfoDouble(_Symbol,SYMBOL_BID)

Andrey Barinov:

Еще есть SymbolInfoDouble(_Symbol,SYMBOL_BID)

Да, возвращает тоже самое, что SymbolInfoTick().