garbagecollect
Для автоматического удаления объектов использую следующий код:
private.data = setmetatable({}, {__mode = 'k'})
private.db = setmetatable({}, {__mode = 'kv'})

---@param self Object
---@param obj any
function newObject(self, obj, destructor)
    local priv = {
        obj = obj,
        destructor = destructor
    }
    private.data[self] = setmetatable(priv, private.metatable)
    private.db[obj] = self
end

function destroy(priv)
    if priv.obj then
        priv.destructor(priv.obj)
    end
    priv.obj = nil
end

private.metatable = {
    __gc = destroy
} 
Столкнулся с крашами при завершении игры после создания через эти функции предметов или фреймов. Экспериментально выявлено, что причина в функции destroy. Но эта функция ведет себя совершенно нормально, если вызывать ее вручную. Предполагаю, что это вызвано попыткой уничтожить через луа объект, который уже уничтожен в движке вара. И собственно вопрос, можно ли как-то проверить валидность данных или объектов wc3?

Лучший ответ:
А в мультиплеере это еще и чревато десинками т.к. работа сборщика мусора не синхронится и в принципе не может синхрониться.


Views: 275

prog #1 - 10 months ago 1
Голосов: +1 / -0

А в мультиплеере это еще и чревато десинками т.к. работа сборщика мусора не синхронится и в принципе не может синхрониться.
Nelloy #2 - 10 months ago 0
Голосов: +0 / -0
prog, хм... Даже в голову не приходило, пожалуй при таком раскаде вовсе откажусь от автосборки такого мусора
ScorpioT1000 #3 - 10 months ago 0
Голосов: +0 / -0
Зачем это всё надо? Вы пишете автопилот для самолета?)
N1ghtSiren #4 - 10 months ago 0
Голосов: +0 / -0
DestoyFrame создаёт десинки, хендлы начинают прыгать у разных игроков (1.31)
в рефордже collect garbage вообще был выпилен (мб вернули в последних обновах)
Прикрепленные файлы