Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 3

 
Artyom Trishkin:

Так у тебя где-то неудалённый объект остался. Вот тебе и пишут про утечку памяти.

В узком окошке не видно всего, но 586 объектов не удалены и остаются в памяти.

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

P.S. Заменил скриншот.

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

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

Anatoli Kazharski, 2018.10.27 09:32

При удалении программы с графика в журнал выводятся вот такие предупреждения:


//---

Раньше такого не было. Как от этого избавиться?


 

В тестере тоже такое впервые вижу.


 
Anatoli Kazharski:

В тестере тоже такое впервые вижу.


У меня даже с маленькой структурой после вылета за пределы массива (размер массива этой структуры нулевой был при обращении) в журнал выдалось сообщение про утечку памяти на пять string объектов - в массиве всего пять структур было.

Ты свои объекты не цепляешь к массиву объектов?
 
Artyom Trishkin:

У меня даже с маленькой структурой после вылета за пределы массива (размер массива этой структуры нулевой был при обращении) в журнал выдалось сообщение про утечку памяти на пять string объектов - в массиве всего пять структур было.

Ты свои объекты не цепляешь к массиву объектов?

Нужно сделать краткий пример для воспроизведения.

 
Anatoli Kazharski:

Нужно сделать краткий пример для воспроизведения.

Сложно - не у компа уже, и буду поздно.

В индикаторе к массиву структур обращался в OnItit() прежде, чем увеличил размер массива и заполнил в массиве структуры данными.

1. объявил структуру из двух полей string и bool

2. объявил массив структур

3. вызвал функцию, выводящую данные из массива структур

4. увеличил размер массива структур

5. заполнил структуры в массиве данными.

Как видно, пункт 3 должен быть после пункта 5.

Вот такое и вызвало утечку памяти из пяти string-объектов

 

Краткий код для воспроизведения:

class B {};
class A
  {
public:
   B                 b[];
//---
                     A(void) { ::ArrayResize(b,1); };
                    ~A(void) {};
  };
//---
A a;
//---
void OnInit(void) {}

//---

При удалении программы с графика:


 
Anatoli Kazharski:

Краткий код для воспроизведения:

//---

При удалении программы с графика:


Да, баг. У меня тоже появилось в 1930. Динамических объектов не создается, но память утекает...

А в 1918 все норм еще было.
 
MetaQuotes Software Corp.:
  1. Tester: Оптимизирована и ускорена работа тестера стратегий.

На каком советнике замеры производили?


ЗЫ

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

Ошибки, баги, вопросы

fxsaber, 2018.10.27 14:17

1930

Core 1  pass 0 returned result 99753711.00 in 0:00:03.729
Core 1  pass 1 returned result 99753711.00 in 0:00:03.432
Core 1  pass 2 returned result 99753711.00 in 0:00:03.401
Core 1  pass 3 returned result 99753711.00 in 0:00:03.354
Core 1  pass 4 returned result 99753711.00 in 0:00:03.323
Core 1  pass 5 returned result 99753711.00 in 0:00:03.385
Core 1  pass 6 returned result 99753711.00 in 0:00:03.448
Core 1  pass 7 returned result 99753711.00 in 0:00:03.369
Core 1  pass 8 returned result 99753711.00 in 0:00:03.369
Core 1  pass 9 returned result 99753711.00 in 0:00:03.385
Tester  optimization finished, total passes 10
Statistics      optimization done in 0 minutes 35 seconds
Statistics      shortest pass 0:00:03.323, longest pass 0:00:03.729, average pass 0:00:03.419


Virtual

Core 1  pass 0 returned result 99753711.00 in 0:00:02.231
Core 1  pass 1 returned result 99753711.00 in 0:00:01.217
Core 1  pass 2 returned result 99753711.00 in 0:00:01.217
Core 1  pass 3 returned result 99753711.00 in 0:00:01.185
Core 1  pass 4 returned result 99753711.00 in 0:00:01.170
Core 1  pass 5 returned result 99753711.00 in 0:00:01.201
Core 1  pass 6 returned result 99753711.00 in 0:00:01.186
Core 1  pass 7 returned result 99753711.00 in 0:00:01.201
Core 1  pass 8 returned result 99753711.00 in 0:00:01.185
Core 1  pass 9 returned result 99753711.00 in 0:00:01.202
Tester  optimization finished, total passes 10
Statistics      optimization done in 0 minutes 13 seconds
Statistics      shortest pass 0:00:01.170, longest pass 0:00:02.231, average pass 0:00:01.299


Разница в три раза, как и было с 1881. Возможно, где-то в другом месте подкрутили. Но темы OrderSend, скорее всего, не касались.

 

// C#

public static string GetVariableNames(string input, string separator)

{
  //var vars = false;
  //var variable = string.Empty;
  //var variables = string.Empty;

  //foreach (var i in input)
  //{
  //  if (Equals(i, separator[0]))
  //  {
  //    if (!(vars = !vars))
  //    {
  //      variables += separator + variable;
  //    }

  //    variable = string.Empty;
  //    continue;
  //  }

  //  if (vars)
  //  {
  //    variable += i;
  //  }
  //}

  //return variables;

  return string.Join(separator, Regex
    .Matches(input, separator + "([^" + separator + "]+)" + separator)
    .Cast<Match>()
    .Select(match => match.Groups[1].Value));
}

// MQL5

CParser::GetVariableNames("0.01 * (#EURUSD# + #GBPUSD# + #EURGBP# + #USDCHF#)");
2018.10.27 16:22:07.106 Expression (EURGBP,D1)  4 leaked strings left
2018.10.27 16:22:07.106 Expression (EURGBP,D1)  12241088 bytes of leaked memory



 
Anatoli Kazharski:

Нужно сделать краткий пример для воспроизведения.

Берём пример из описания функции StringSplit() в разделе Документация.

Запускаем:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string to_split="_мама_мыла_раму_"; // строка для разбивки на подстроки
   string sep="_";                  // разделитель в виде символа
   ushort u_sep;                    // код символа разделителя
   string result[];                 // массив для получения строк
   //--- получим код разделителя
   u_sep=StringGetCharacter(sep,0);
   //--- разобьем строку на подстроки
   int k=StringSplit(to_split,u_sep,result);
   //--- выведем комментарий 
   PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);
   //--- теперь выведем все полученные строки
   if(k>0)
     {
      for(int i=0;i<k;i++)
        {
         PrintFormat("result[%d]=\"%s\"",i,result[i]);
        }
     }   
  }

Получаем:


Причём,

   ArrayFree(result);  

не решает проблему.

А вот присвоение пустых строк - решает:

   for(int i=0;i<k;i++)
      result[i]="";
Причина обращения: