XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
Утечки без явного создания хендла =О
Перевожу стандартное бж убожество в нормальный вид. Функция возвращает предмет, если он есть в инвентаре (что в бж делается через 3 функции).
» функция 1
function FindItem takes unit u, integer Id returns item
local integer i = 0
    loop
        exitwhen i > 5
            if GetItemTypeId(UnitItemInSlot(u, i)) == Id then
                return UnitItemInSlot(u, i)
            endif
        set i = i + 1
    endloop
return null
endfunction
С функцией всё в порядке - никаких хэндлов не создаётся, всё ок и утечек быть не может. Но при проверке выясняется, что при использовании такой функции всего 1 раз появляется аж 120 утечек =О. Преобразовал функцию с использованием локальной ссылки на итем:
» функция 2
function FindItem2 takes unit u, integer Id returns item
local integer i = 0
local item ITM = null
    loop
        exitwhen i > 5
            set ITM = UnitItemInSlot(u, i) // в цикле работаем только с локальной ссылкой
            if GetItemTypeId(ITM) == Id then
                return ITM
            endif
        set i = i + 1
    endloop
set ITM = null
return null
endfunction
И никаких утечек не было вообще. Других изменений в карте не было. Собственно вопрос: откуда берётся создание стольких лишних хэндлов в первой функции?
Для особенных умников: тесты на наличие утечек проводились по нескольку раз и наличие других источников утечек исключается.
» Кодэ для проверки утечек:
function Check takes nothing returns nothing
    local timer t = CreateTimer()
    call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, I2S(GetHandleId(t)))
    call DestroyTimer(t)
    set t = null
endfunction

function CheckOnOff takes nothing returns nothing
    if GetEventPlayerChatString() == "-on" then
        call EnableTrigger(gg_trg_CheckOnOff)
    else
        call DisableTrigger(gg_trg_CheckOnOff)
    endif
endfunction

function InitTrig_CheckOnOff takes nothing returns nothing
    local trigger trig = CreateTrigger()
    local integer i = 0
    loop
        exitwhen i > 11
        call TriggerRegisterPlayerChatEvent(trig, Player(i), "-on", true)
        call TriggerRegisterPlayerChatEvent(trig, Player(i), "-off", true)
        set i = i + 1
    endloop
    call TriggerAddAction( trig, function CheckOnOff)
    set gg_trg_CheckOnOff = CreateTrigger()
    call TriggerRegisterTimerEvent(gg_trg_CheckOnOff, 0.1, true)
    call TriggerAddAction(gg_trg_CheckOnOff, function Check)
    call DisableTrigger(gg_trg_CheckOnOff)
endfunction
Скайнет добавил:
единственное логическое объяснение, которое я вижу - если функция что-то возвращает, то без указания условной ссылки на ячейку памяти((локальная переменная), т.е. куда будет записываться результат деятельности функции), будет выбираться рандомная, которую потом никак не удалить.
Старый 05.01.2011, 02:07
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
UnitItemInSlot
возвращает предмет
предмет == виджет
а ты говоришь хендла у тебя нет...
во второй функции они пишутся в локалку ITM тоесть перезаписываются в 1 ячейку
тащемта мысль верная
Старый 05.01.2011, 02:34
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
спасибо, о повелител
Старый 05.01.2011, 02:53
DioD

offline
Опыт: 45,184
Активность:
ваш метод тестирования на утечки фуфло, вы ничего не понимаете в утечках.
if UnitItemInSlot(u, i) == UnitItemInSlot(u, i) then
нету блеять утечек, статическая ссылка
else
есть блеять утечки
endif
[+] 1 пункт от ScorpioT1000: 1.1 (ненормативная лексика)
Старый 05.01.2011, 03:09
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 22:45.