Есть способность которая использует дамми снаряд и таймер к нему.
	local timer tt=CreateTimer()
	local unit d=CreateUnit(p,id,x,y,a)
	...
	call SaveUnitHandle(sHash,id,1,d)
	call TimerStart(tt,0.03,true,function func)
по выполнению таймер с юнитом удаляются.
	local timer tt=GetExpiredTimer()
	local integer id=GetHandleId(tt)
	local unit d=LoadUnitHandle(sHash,id,1)
	...
    call RemoveUnit(d)
    call FlushChildHashtable(sHash,id)
    call DestroyTimer(tt)
Для отслеживания утечек использую библиотеку
раскрыть
library Leaks initializer LeaksInit
globals
leaderboard lboard
endglobals

function Callback takes nothing returns nothing
    local location array loc
    local integer a = 0
    local integer index 
    local integer prevIndex = 0
    local integer next = 0
    loop
        set loc[a] = Location(0., 0.)
        set index = GetHandleId(loc[a]) - 0x100000
        set a = a + 1
        if index == prevIndex + 1 then
            set next = next + 1
        else
            set next = 0
        endif
        set prevIndex = index
        exitwhen next >= 15
    endloop
    call LeaderboardSetItemValue(lboard, 0, index - a)
    loop
        set a = a - 1
        call RemoveLocation(loc[a])
        set loc[a] = null
        exitwhen a <= 0
    endloop
endfunction
function Actions takes nothing returns nothing
    local timer tim = GetExpiredTimer()
    set lboard = CreateLeaderboard()
    call LeaderboardSetLabel(lboard, "Handlers")
    call PlayerSetLeaderboard(GetLocalPlayer(), lboard)
    call LeaderboardDisplay(lboard, true)
    call TimerStart(tim, 0.25, true, function Callback)
    call LeaderboardAddItem(lboard, "Max Handles", 0, Player(0))
    call LeaderboardSetSizeByItemCount(lboard, 1)
    set tim = null
endfunction
function LeaksInit takes nothing returns nothing
    call TimerStart(CreateTimer() , 0., false, function Actions)
endfunction
endlibrary
которая говорит, что при каждом юзе способности утекают 2 хендла (юнита и таймера соответственно). GetHandleId(d) каждый раз растет на 2.
Но мемхак и его ConvertHandle(d) при каждом непаралельном вызове возвращает одно и то же значение хендла юнита.
Собственно утечка или нет? и кто врет?

адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Обнулять за вас локалки кто будет?
Zeix, И где тут мемхак? Не вижу что то применение мемхака в данном коде, вот к примеру тут используется мемхак, а у вас нет.
7
Все обновляется и удаляется как надо. Я не писал весь код, что бы не замыливать глаза, так как в нем используется еще куча всего что может утекать, но не утекает.
DracoL1ch:
что такое параллельный вызов и как связан мемхак с хендлом? оО
Параллельно, я имел ввиду МУИ использование. То есть если я использую способность Варик создаст юнита в памяти (ConvertHandle вернет адрес этого юнита в памяти) после выполнения удалив юнита, память освободится. При новом вызове варик создаст нового юнита и опять выделит под него память, а ConverHandle будет тот же самый, значит прошлый юнит удалился и освободил место для нового. Если вызвать способность дважды, создастся два юнита и получат разные места в памяти, и ConvertHandle будет различаться, что и происходит. Поправьте меня если я не прав.
quq_CCCP:
Zeix, И где тут мемхак? Не вижу что то применение мемхака в данном коде, вот к примеру тут используется мемхак, а у вас нет.
Мемхак не используется в способности, чего я и не утверждал, Я использовал только ее функцию, что бы понять что происходит.
32
Zeix, Совершенно не верно, хендл юнита != адресс в памяти, хендл всего лишь ссылка на обьект в таблице объектов.
GetHandleId() - ни имеет никакого отношения к мемхаку, мемхак основан на ретурнбаге типа code и array, code в свою очередь никак не связан с handle.
16
адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
Принятый ответ
26
RemoveUnit заставляет движок забыть о юните, что иногда чревато
Чем?
26
quq_CCCP, а в чем, собственно, проблема то?
Кому-то нужны хендлы не существующих объектов?
32
avuremybe, создаешь ты такой юнита, а на него уже записаны события триггеров, да и вовсе какая то хрень берет ему таймед лайв вешает...
26
quq_CCCP, не знаю, как надо писать код, чтоб там творился такой хаос.
Но ситуацию понял, спасибо за пояснение.
16
тем же, почему проблемно с иллюзиями рабоать
в норме юнит удаляется из памяти после разложения трупа
у саммонов и иллюзий нет разложения и они удаляются сразу. если они были дальниками, то все запущенными ими снаряды будут ссылаться на несуществующего юнита, т.е. null. аналогично с удалением.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.