Суть проблемы в шапке, вот сам тестовый скрипт:
По какой-то причине call DestroyGroup не работет :С, за пару секунд натекает 20 handl'ов соответственно:
Версия игры 1.27
Для измерения утечек использовал этот скрипт: xgm.guru/p/wc3/206488
Кто сталкивался? Помогите пожалуйста, добрые люди

Ваш код раскрывается в
function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction
Вот эта группа и течёт.
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Ваш код раскрывается в
function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction
Вот эта группа и течёт.
Принятый ответ
12
NazarPunk:
Ваш код раскрывается в
function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction
Вот эта группа и течёт.
как быть в таком случае? как чистить аналогичные утечки?
30
как быть в таком случае? как чистить аналогичные утечки?
В идеальном случае перейти на jass или подождать, пока ответят те, кто работают на GUI в 1.27.
И удостоверится, что течёт именно тот код.
28
Точнее течёт хендл, а не сама группа. Размер потребления ОЗУ не сильно растёт (если вообще растёт).
Утечка происходит из-за не обнулённой переменной g.
26
С таким подходом и call DestroyGroup(CreateGroup()) течёт.

. . .
А вот если вытащить внутрянку - то становится всё ровно.
local group g = CreateGroup()
call GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, null)
call DestroyGroup(g)
set g = null // ну это если глобалку убрать и писать сразу на Jass'е
. . .
Хмм... интересно, что интересно? а вот что.
Что он имеет:
function Trig_test_Actions takes nothing returns nothing
    local group g = GetUnitsInRectAll(GetPlayableMapRect())
    call DestroyGroup(g)
    set g = null
endfunction
Это течёт... раскроем GetUnitsInRectAll(GetPlayableMapRect())
function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction // это базовая функция, я просто вытащил её сюда для наглядности

function Trig_test_Actions takes nothing returns nothing
    local group g = GetUnitsInRectMatching(GetPlayableMapRect(), null)
    call DestroyGroup(g)
    set g = null
endfunction
Это всё равно течёт (о чём и указывается в 1м посте).
А вот если самому сделать ТОЖЕ САМОЕ, вот так:
function GetUnitsInRectMatching_V2 takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction // это 100%-я копия базовой функции

function Trig_test_Actions takes nothing returns nothing
    local group g = GetUnitsInRectMatching_V2(GetPlayableMapRect(), null)
    call DestroyGroup(g)
    set g = null
endfunction
тут я добавил только _V2, а по факту - скопировал базовую функцию
То уже не течёт... вообще никак (используя приложенный в топике инструмент).
28
Оно может начать течь через случайное время после старта, или после создания другого объекта.
Внутри какая-то ошибка сборки мусора или чего, что и ведёт к утечке хендлов в случайные моменты.
18
PT153:
Утечка происходит из-за не обнулённой переменной g.
А как обнулять, если мы её возвращаем?
16
На GUI утечки не пофиксить, всё-равно придётся писать на джасс. Ну вот реализация на GUI через Custom script.
Загруженные файлы
27
Vlod, либо обнуляйте до return (полезно использовать когда boolean (например узнать пуста ли группа) или число (как пример узнать кол-во юнитов в группе).
  1. используешь группу (объявляем локи создаем пикаем)
  2. записываешь временные локалки например число юнитов в группе set c = ... (циклом перечитываешь)
  3. удаляешь группу DestroyGroup(g), локи обнуляешь set g = null,
  4. возвращаешь
boolean: return c>0 или FirstOfGroup(g) == null (если g это аргумент функции, обнулять ниче не надо тогда. можно тогда отдельную обертку написать и boolean локалку завернуть)
или integer: return c)
или как в этом случае вместо локалки используйте темповые глобалки
26
bifurcated, ты удалил всех юнитов из группы по одному, зачем предпоследним действием удаляешь всех юнитов из пустой группы?
16
8gabriel8, Если сделать проверку на udg_TempGroup == null, то она не пройдёт, если таких проверок не делаешь, то и незачем это писать.
28
А как обнулять, если мы её возвращаем?
Через глобалку.

зачем предпоследним действием удаляешь всех юнитов из пустой группы?
Он также присваивает переменной юнита, которая уже null, ещё раз null.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.