Есть способность которая использует дамми снаряд и таймер к нему.
	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, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
16
7 лет назад
0
RemoveUnit заставляет движок забыть о юните, что иногда чревато
Чем?
2
32
7 лет назад
2
avuremybe, получишь нового юнита со старым хендлом.
0
16
7 лет назад
Отредактирован avuremybe
0
quq_CCCP, а в чем, собственно, проблема то?
Кому-то нужны хендлы не существующих объектов?
0
32
7 лет назад
0
avuremybe, создаешь ты такой юнита, а на него уже записаны события триггеров, да и вовсе какая то хрень берет ему таймед лайв вешает...
0
16
7 лет назад
0
quq_CCCP, не знаю, как надо писать код, чтоб там творился такой хаос.
Но ситуацию понял, спасибо за пояснение.
0
16
7 лет назад
0
тем же, почему проблемно с иллюзиями рабоать
в норме юнит удаляется из памяти после разложения трупа
у саммонов и иллюзий нет разложения и они удаляются сразу. если они были дальниками, то все запущенными ими снаряды будут ссылаться на несуществующего юнита, т.е. null. аналогично с удалением.
0
14
7 лет назад
0
получишь нового юнита со старым хендлом
При создании юнита и первом получении его хендла, количество ссылок равно единице.
Каждая ссылающаяся на handle переменная, добавляет к счетчику единицу.
Уничтожение юнита уменьшает счетчик на единицу.
По достижению нуля ссылок, handle освобождается и может быть переиспользован.
А значит, пока есть переменная, которая держит ссылку на юнита, его handle не будет использован для других объектов, даже после его уничтожения.
0
28
6 лет назад
Отредактирован PT153
0
DracoL1ch:
адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
Хм, а если у юнита стоит Can't raise, does not decay, то он сразу разложится, как только пройдёт Death Time?
0
16
6 лет назад
0
Death Time
Это анимация смерти?
0
28
6 лет назад
Отредактирован PT153
0
avuremybe:
Death Time
Это анимация смерти?
Это целочисленное значение РО в поле Art.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.