Нужно ли обнулять handle в хеш-таблице?
Подскажите, создает ли данный код утечку:
SaveHashtableHandle( Hashtable, id , 0, val )
FlushChildHashtable( Hashtable, id )



Views: 527

» Лучшие комментарии


NazarPunk #1 - 1 year ago 0
Голосов: +0 / -0
А вы хоть читали откуда берутся утечки?
Vlod #3 - 1 year ago -1
Голосов: +0 / -1
NazarPunk:
А вы хоть читали откуда берутся утечки?
а вы?
NazarPunk #4 - 1 year ago (изм. ) 0
Голосов: +0 / -0
а вы?
А я не задаю вопросов, ответ на которые есть в статьях.

SaveHashtableHandle( Hashtable, id , 0, val )
FlushChildHashtable( Hashtable, id )
Откуда здесь утечки, если вы не создаёте хэндлов, которые повиснут в памяти?
Hate #6 - 1 year ago 3
Голосов: +3 / -0
вы же очищаете все дочерние ячейки, это же в названии написано самой функции
Vlod #7 - 1 year ago (изм. ) 0
Голосов: +0 / -0
SaveUnitHandle(Hashtable, id, CreateUnit(...))
FlushChildHashtable(Hashtable, id)
Под переменной val уже имелось ввиду наличие созданного объекта. (см. название вопроса)
Hate:
вы же очищаете все дочерние ячейки, это же в названии написано самой функции

Вопрос про обнуление элемента, так как в других структурах, будь то глобальный массив или локальная переменная, объект не удалится, если не вписать туда null.
Hodor #8 - 1 year ago 0
Голосов: +0 / -0
Представь что handle это тот же integer
просто содержит ссылку на какой то игровой объект
Hate #9 - 1 year ago 0
Голосов: +0 / -0
как сказали выше, хендл это не сам объект а ссылка на него, что бы его уничтожить нужно вручную вызывать соответствующие функции, сам по себе он наврятли исчезнет (офк в разумных пределах)
Vlod #10 - 1 year ago 0
Голосов: +0 / -0
Представь что handle это тот же integer
просто содержит ссылку на какой то игровой объект
handle это и так __int32, каким образом эта информация говорит о работе счетчика ссылок?
Hate, спасибо за полезную информацию, не могли бы вы ответить на тему самого вопроса?
NazarPunk #11 - 1 year ago (изм. ) 0
Голосов: +0 / -0
не могли бы вы ответить на тему самого вопроса?
Могу и я ответить
Нужно ли обнулять handle в хеш-таблице?
Нужно.

Неужели так уж сложно немного подумать?
local handle a = GetHandleId() -- создаём хэндл
call SaveHashtableHandle( Hashtable, id , 0, val ) -- в хэштаблице по ключам id,0 появилось значение этого хэндла
call FlushChildHashtable( Hashtable, id ) -- все записи по ключу id исчезли из таблицы
set a = null -- хэндл никуда не делся и его нужно обнулить
Hodor #12 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Vlod,
А тебе в голову не приходила мысль что FlushChildHashtable очищает, так же как и RemoveSavedHandle
И каким образом обычное присваивание null может влиять на так называемый "счетчик ссылок"?
Я бы даже так сказал: если не делать FlushChildHashtable или RemoveSavedHandle - то это как раз и будет утечкой
Vlod #13 - 1 year ago 0
Голосов: +0 / -0
И каким образом обычное присваивание null может влиять на так называемый "счетчик ссылок"?
function(...)
local u = CreateUnit(...)
endfunction
Конечно я могу ошибаться, но в этом случае счетчик ссылок объекта u никогда не достигнет нуля.
Hodor #14 - 1 year ago 0
Голосов: +0 / -0

Немного мат части:
Если в хештаблице не существует ключа, то хештаблица всегда будет возвращать ноль (он же null)
Поэтому возникает иллюзия что FlushChildHashtable (и прочие) равны обычному присваиванию null или 0
Vlod,
это долго объяснять, просто не парься если хендл-переменная не локалка
а если локалка - то в конце функции обнуляй её
Vlod #15 - 1 year ago 0
Голосов: +0 / -0
Hodor, я в курсе, что во многом вы разбираетесь. Но спрашивал я совсем другое, понимаете
Hodor #16 - 1 year ago 0
Голосов: +0 / -0
Подскажите, создает ли данный код утечку
не создает

Vlod:
function(...)
local u = CreateUnit(...)
endfunction
""
надо написать set u = null перед endfunction

Так понятнее?
NazarPunk #17 - 1 year ago 0
Голосов: +0 / -0
Конечно я могу ошибаться, но в этом случае счетчик ссылок объекта u никогда не достигнет нуля.
Объект u всего лишь указатель на созданного юнита, который повиснет в памяти, если не сделать set a = null. Какой ещё счётчик ссылок у него может быть?
Hodor #18 - 1 year ago 0
Голосов: +0 / -0

Vlod #19 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Darklight: Проверил Предмет, Группу, Таймер - всё в Хеш таблице отрабатывает одинаково - после удаления объекта в его ячейку в Хеш таблице заносится значение null, а если хранить объект в переменной - то хендл с ней сохраняется (вместе с исходным идентификатором хендла, хотя сам объект более не существует).
Да, это оно, спасибо Hodor
И всем, кто старался помочь