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