Подскажите, создает ли данный код утечку:
SaveHashtableHandle( Hashtable, id , 0, val )
FlushChildHashtable( Hashtable, id )
`
ОЖИДАНИЕ РЕКЛАМЫ...
18
NazarPunk:
А вы хоть читали откуда берутся утечки?
а вы?
30
а вы?
А я не задаю вопросов, ответ на которые есть в статьях.

SaveHashtableHandle( Hashtable, id , 0, val )
FlushChildHashtable( Hashtable, id )
Откуда здесь утечки, если вы не создаёте хэндлов, которые повиснут в памяти?
26
вы же очищаете все дочерние ячейки, это же в названии написано самой функции
18
SaveUnitHandle(Hashtable, id, CreateUnit(...))
FlushChildHashtable(Hashtable, id)
Под переменной val уже имелось ввиду наличие созданного объекта. (см. название вопроса)
Hate:
вы же очищаете все дочерние ячейки, это же в названии написано самой функции

Вопрос про обнуление элемента, так как в других структурах, будь то глобальный массив или локальная переменная, объект не удалится, если не вписать туда null.
18
Представь что handle это тот же integer
просто содержит ссылку на какой то игровой объект
26
как сказали выше, хендл это не сам объект а ссылка на него, что бы его уничтожить нужно вручную вызывать соответствующие функции, сам по себе он наврятли исчезнет (офк в разумных пределах)
18
Представь что handle это тот же integer
просто содержит ссылку на какой то игровой объект
handle это и так __int32, каким образом эта информация говорит о работе счетчика ссылок?
Hate, спасибо за полезную информацию, не могли бы вы ответить на тему самого вопроса?
30
не могли бы вы ответить на тему самого вопроса?
Могу и я ответить
Нужно ли обнулять handle в хеш-таблице?
Нужно.

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

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

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

Так понятнее?
30
Конечно я могу ошибаться, но в этом случае счетчик ссылок объекта u никогда не достигнет нуля.
Объект u всего лишь указатель на созданного юнита, который повиснет в памяти, если не сделать set a = null. Какой ещё счётчик ссылок у него может быть?
18
Darklight: Проверил Предмет, Группу, Таймер - всё в Хеш таблице отрабатывает одинаково - после удаления объекта в его ячейку в Хеш таблице заносится значение null, а если хранить объект в переменной - то хендл с ней сохраняется (вместе с исходным идентификатором хендла, хотя сам объект более не существует).
Да, это оно, спасибо Hodor
И всем, кто старался помочь
Чтобы оставить комментарий, пожалуйста, войдите на сайт.