天天看點

寫 lua 腳本時遇到的記憶體洩漏案例

從開始用lua到現在,也有一年多時間,作為腳本語言,很簡單,基本屬于1天入門,3天熟練,5天精通;

從接觸lua起,就有固定的思維模式:這是一門自動化記憶體管理的腳本語言;

于是乎,我自然而然地認為,lua不會存在記憶體洩漏的問題;

直到我自己寫出記憶體洩漏的lua代碼。。。

--示例
--先聲明,我知道發生了記憶體洩漏,但我并不知道内部是什麼原理導緻洩漏

--[[
--表形式如下
local t = {
    person={
        name=xxx,
        age=xxx,
    },
}
--]]


--假設t中有1000條記錄
--此時我們需要循環删除某些節點

for k,v in pairs(t) do
    if v.age < 12 then
        v=nil            -- 造成記憶體洩漏的位置
    end
end

--有時候看起來這代碼好像并沒啥問題
--語言内部自動記憶體管理
--釋放記憶體時
--就是把變量置為nil
--然而這種寫法是不允許的
--不懂内部如何處理
--就不多分析了
--改成以下寫法即可

local needDel={}
for k,v in pairs(t) do
    table.insert(needDel,k)
end
for k,v in ipairs(needDel) do
    t[v] = nil            -- 正确寫法
end