Утечка памяти в сложных булевских выражениях

 
Скрипт с кодом, подобным:

while (!IsStopped()) {
string s = "notfunny";
for (int j = 0; j<1000; j++) {
bool q = (StringSubstr("leak",1)==s || s == "terrible");
}
Sleep(10);
}

вызывает утечку памяти в совершенно гигантских масштабах (мегабайты в секунду).
 
А так ?
bool q;
while (!IsStopped()) {
string s = "notfunny";
for (int j = 0; j<1000; j++) {
q = (StringSubstr("leak",1)==s || s == "terrible");
}
Sleep(10);
}
 
И так течет (собственно, обратное было бы странно - от области видимости такие вещи зависеть не должны)

Дело где-то в самом выражении, первоначально это был if, т.е можно заменить на
if (blah-blah) dumb_var = 1; и все равно будет. Зато удаление части после || утечку прекращает.

А у вас не течет разве? Это пропустить невозможно, в банальном списке процессов заметно сразу.
 
Есть такое дело. Спасибо за находку. Слава разбирается.
 
Спасибо. Нашли ошибку в кодогенераторе. В ближайшее время будет исправление
 
Вот и замечательно, вам спасибо ).
 
Может быть, из-за этой ошибки появлялось сообщение:
2007.02.27 10:24:00 Memory handler: cannot allocate 2088773164 bytes of memory
?

И индикатор с таким сообщением не работает. Это уже обсуждалось в другой ветке.

В индикаторе много сложных булевых выражений.
 
Что касается приведенного мной случая, там память течет все же не гигабайтами, хотя и неостановимо )). Данный кусок кода использовался в цикле удаления объектов (которых у меня на графике много), а индикатор с этим кодом был безостановочно обновляем автообновлялкой. Т.е. проходов много. Посему эффект и проявился - когда mt зажрал 1.2G, я увидел подтормаживание и подумал, что дело нечисто )). В секунду приведенный пример жрет килобайт сто, условно 50 проходов в секунду по тысяче в цикле:

Т.е. одно использование сложного выражения жрет несколько байт.

Так что имеет смысл оценить тот ваш индикатор с этой точки зрения. За секунду он 2G не должен израсходовать (если бесконечных циклов нет). Хотя, конечно, чем черт не шутит.
 
Что касается приведенного мной случая, там память течет все же не гигабайтами, хотя и неостановимо )). Данный кусок кода использовался в цикле удаления объектов (которых у меня на графике много), а индикатор с этим кодом был безостановочно обновляем автообновлялкой. Т.е. проходов много. Посему эффект и проявился - когда mt зажрал 1.2G, я увидел подтормаживание и подумал, что дело нечисто )). В секунду приведенный пример жрет килобайт сто, условно 50 проходов в секунду по тысяче в цикле:

Т.е. одно использование сложного выражения жрет несколько байт.

Так что имеет смысл оценить тот ваш индикатор с этой точки зрения. За секунду он 2G не должен израсходовать (если бесконечных циклов нет). Хотя, конечно, чем черт не шутит.


P.S. - в несколько иных условиях оно жрало пару мегов в секунду - но в любом случае, имеет смысл посмотреть на расходуемую память в процессах - процесс зажирания будет виден, мгновенно это случиться не должно.
 
Попробуйте ограничить количество баров на графиках
 
Попробуйте ограничить количество баров на графиках
И 500 баров не помогает. Это уже обсуждалось в соседней ветке. Причем очень фигуристо эта ошибка проявляется. Во первых, не у всех. Во вторых, очень избирательно.

Вот цитаты:

name='Heinz Atkins' date='21.1.2007, 1:08' post='153586']
Я решил проблему с памятью путём замены ilowest на lowest, ihighest на highest. Всвязи с этим у меня вопрос: сильно ли скажется это на функциональной работе zup_55? Применил к графику, вроде всё работает.


name='Heinz Atkins' date='21.1.2007, 14:02' post='153635']
Вчера убил целый день на решение этой проблемы. Я установил 197 билд, заменил функции, скомпилировал, вывел на график, сделал апдейт до 201. Всё заработало. Потом пробовал заменить уже на работающем zup_55 функции снова на iLowest итд...
Как только скомпилировал zup_55 перестал работать в експертах и журналах писал - Memory handler: cannot allocate 2 088 773 148 bytes of memory. Я плохо разбираюсь в коде, но я думаю причастность функций iHighest и iLowest к проблемам с памятью доказана. С регистром и количеством баров в окне и в истории это точно не связано. Я думаю всем тем кто столкнулся с этой проблемой стоит прочитать это сообщение.


name='Heinz Atkins' date='21.1.2007, 15:41' post='153648']
Да, были проблемы и до iLowest..., но мы их по-моему решили с помощью старого билда? У меня например сейчас в папке лежат три ZUP 55 54 53. Если сейчас я положу туда 52, то он не заработает, поскольку я его не компилировал на 197 и не применял к графику до апдейта. Вообщем еще стоит поразбираться в этой проблеме. В любом случае для себя я всё решил, проблема памяти не беспокоит.


name='Yoda_2' date='23.1.2007, 16:15' post='154460']
Что-то индиктор Zup_v55 не присоединяется к графику, все другие присоединились нормально.
В журнале пишит - Memory handler: cannot allocate 2 088 773 148 bytes of memory
Что делать?


name='VEKTOR' date='24.1.2007, 21:07' post='155390']
Загрузил ZUP-v56 в 198 билд, в Мето Едиторе исправил 2 iHighest и 2 iLowest .[color=#FF0000]201 билд не обновлял[/color].56 заработал , 54 и 55 ТОЖЕ,обновил 201 билд все работает
Спасибо ВСЕМ!



name='NemoL' date='27.2.2007, 11:43' post='173734']
Доброе время суток всем!

Ну вот и у меня вылезло...
2007.02.27 10:24:00 Memory handler: cannot allocate 2088773164 bytes of memory

ZUP_v59 :unsure: , предыдущие работают (те которые ставил - 47, 54, 58 ^secret^ )

Колличество баров, выводимых в окно, уменьшил до 500.
Ставил старый bild (сейчас 202 от MetaQuotes), поставил 201 от Straighthold - ничего. Закачал котировки поновой - пусто.

Может кто чего посоветует ещё, как убрать это противное "Memory handler"???

Вечером попробую на работе закинуть 59-й, на другой комп, если пойдет...
Тогда FORMAT C:\ :blink:

Всем удачи! :big_boss:


name='NemoL' date='28.2.2007, 11:26' post='174418']
name='поручик' post='174037' date='27.2.2007, 18:32']
NemoL, пробуй МТ от разных ДЦ. У меня 51 на 197 Альпари и 56 на 202 Лайта. Более поздние не встают :(

У меня 202 MT, инсталяшка от MetaQuotes, но настроен на работу с Лайтом, на работе тоже самое. Дома работают несколько ZUPов - до 59-й версии. Вчера вечером закинул ZUP_59 на рабочий комп и просто запустил MT, работает без проблем. Хотя там была проблема с 54-м, тоже "...Memory handler...", как я её решил - писал выше. Но дома ни в какую :(((
Ну да ладно, особо пока не напрягает, хватает предыдущих версий. Когда напряжет - format C:\
хотя Maksas в первых постах писал об этом, что перестановка системы непомогла.

Некоторое время назад, еще до знакомства с ZUP NENa, я переделывал какой то индикатор из MetaStocka на MQL4. И время от времени при его запуске, в буферы индюка записывались очень огромные значения, откуда это вылазило так и непонял, код то был простой, индикатор отображался и погоняв таймфреймы туда сюда несколько раз, значения приходили в норму. Это я к чему, может и эдесь такая же чехарда вылазит.

Вопрос к NENu ^scenic^
Как Вы думаете, такая ситуация возможна? Что при некотором стечении неблагоприятных ситуаций при работе MetaTrader & MetaEditor & MQL4 (+солнечная активность... :))) и т.д. и т.п.) во время выполнения кода индикатора, в некоторую ячейку памяти, переменную, или может буфер, то что первично и важно для дальнейших расчетов, записывается мусор (огромное число), или наоборот - мусор остаётся, неудаляется, или нужное значение незаписывается. И ZUP при дальнейших расчётах берёт это неправильное число и вываливается с ошибкой.
Memory handler: cannot allocate 2088773164 bytes of memory

На разных компах не может быть одинаковое сообщение! И что это такое? немогу распределить 2 гига памяти???
2007.02.28 09:21:26 ZUP_v59 USDJPY,H4: not enough memory for stack (2088773164 bytes)
А это что за билиберда? недостаточно памяти под стек???
Нет, это всё происки ошибок MT4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Хотя всё это только мои мысли и может быть неправильные.

Всем удачи :big_boss:


name='NemoL' date='1.3.2007, 10:14' post='174962']
Скопировал всю папку MetaTrader4, с компа на котором ZUP59 неработает. На рабочем компе удалил МТ недеинсталируя, записал на это место копию МТ с компа на котором ZUP59 неработал. Запустил - всё работает!
Скопировал всю папку MetaTrader4, с компа на катором ZUP59 работает. На домашнем компе удалил МТ и на это место записал копию с рабочего компа. Запустил - всё работает!

Потом вернул всё как было - неработает!

Работаю с рабочей версией.

Всем удачи :big_boss:


Это только часть. Обращались здесь, на форуме, с этой проблемой. Но глухая стена. Люди мучаются и сами кто что найдет. Но у всех однозначное мнение. Проблема появилась после 199 билда метатрейдера. И, соответственно, проблема из-за метатрейдера.

У большинства работает нормально. У меня ни разу такой проблемы не было.

Код индикатора здесь физически не поместится. Более 5000 строк. На Ониксе можно скачать любую версию в архивах
Причина обращения: