Суть проблемы в шапке, вот сам тестовый скрипт:
По какой-то причине 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.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.