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

 
Что означает предупреждение в журнале экспертов, после завершения скрипта?
2 leaked strings left

Как это можно полечить?
Переводчик переводит, две утечки строк слева. Но не понятно, слева чего, строки?

В скрипте используется  JAson  библиотека.
Из dll принимается Json строка через memcpy_s, в dll эта строка имеет тип const wchar_t*
В #import параметр экспортированной функции, объявлен как  string & str, то есть по ссылке, а сама строка объявлена как string str;
Далее строка str десериализуется 

js.Deserialize(str); 

Проблема именно в десериализации пришедшей строки из memcpy_s.

Так как если в скрипте создать проверочную json строку 

string str = "{\"s\":\"1000\"}";

то предупредительное сообщение не появляется.
Десериализую пришедшую строку из dll, снова появляется предупреждение после завершения скрипта, 2 leaked strings left 

Пробовал пришедшею строку преобразовать в char массив StringToCharArray, и десериализовать char массив.
Но проблема остаётся, и так же появляется 2 leaked strings left.
В чём может быть причина?

 
Из dll попробовал явно передать проверочную json строку 
L"{\"s\":\"1000\"}"
Предупреждение 
2 leaked strings left исчезло.
Получается, что в dll функция которая читает сетевые данные, вызывает такое поведение.
Но не понятна сама трактовка 
2 leaked strings left, что она конкретно означает и куда дальше копать?
 
Roman:
Из dll попробовал явно передать проверочную json строку 
Предупреждение 
2 leaked strings left исчезло.
Получается, что в dll функция которая читает сетевые данные, вызывает такое поведение.
Но не понятна сама трактовка 
2 leaked strings left, что она конкретно означает и куда дальше копать?

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

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

 

в последнем билде мт4 в тестере не работают функции iHigh,iTime для тамйм фреймов выше дневного

iHigh(NULL,PERIOD_W1,0) = 0
iTime(NULL,PERIOD_W1,0) = NULL


 
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

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