-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
- 調(diào)用一個動態(tài)庫中的函數(shù),這個函數(shù)有一個參數(shù)是結(jié)構(gòu)體指針,我如何使用這個指針?
- lua for 循環(huán) 內(nèi)存占用擴(kuò)大
- 為什么lua語言中使用全局變量就會造成內(nèi)存泄漏
- 為什么lua語言中使用全局變量就會造成內(nèi)存泄漏呢??
lua內(nèi)存泄漏排查(lua 內(nèi)存泄漏檢測)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于lua內(nèi)存泄漏排查的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁版、PC客戶端和批量生成器
官網(wǎng):https://ai.de1919.com。
本文目錄:
調(diào)用一個動態(tài)庫中的函數(shù),這個函數(shù)有一個參數(shù)是結(jié)構(gòu)體指針,我如何使用這個指針?
你就也定義一個形參中的結(jié)構(gòu)體指針接收傳過來的結(jié)構(gòu)體指針就OK啦形參中的結(jié)構(gòu)體指針改變?這什么意思?
給你看個例子吧:
struct node *creat(struct node *l)
{
struct node *head;
head=l;
return head;
}
你是這樣嗎~追問
就是主程序中定義了一個結(jié)構(gòu)體指針1,將其作為形參傳遞給某個調(diào)用函數(shù),在函數(shù)內(nèi)部又給這個形參賦值了一個結(jié)構(gòu)體指針2,這樣這個形參結(jié)構(gòu)體指針1指向的地址就發(fā)生了改變,那在主程序中它的地址也改變么?我怎么發(fā)現(xiàn)他指向的地址沒有改變呢?這樣我怎么能夠使用調(diào)用函數(shù)中的那個結(jié)構(gòu)體指針2呢?
PS:調(diào)用函數(shù)的返回類型已經(jīng)確定,所以這個結(jié)構(gòu)體指針必須作為形參來傳遞
不能說是給這個形參賦值了一個結(jié)構(gòu)體指針2,而是應(yīng)該說用以個結(jié)構(gòu)體指針2接收形參
地址是沒變啊 你的做法是將結(jié)構(gòu)體指針2指向你傳過來的結(jié)構(gòu)體指針1的地址,所以指針1 2所指向的地址是相同的
你把結(jié)構(gòu)體指針2返回就可以啦
我是想讓結(jié)構(gòu)體指針1的地址改變成結(jié)構(gòu)體指針2的地址,并且struct *p1=shtrcut *p2是將p1指向了p2的地址吧?形參p1地址改變了,這樣是對的吧?
lua for 循環(huán) 內(nèi)存占用擴(kuò)大
Lua 會自行管理回收內(nèi)存。你上面這段代碼不會有內(nèi)存泄漏。至于你退出這個腳本后,free顯示的數(shù)值如果維持在原來的數(shù)值而沒有減少,那是因為Linux有它自己的策略來管理內(nèi)存。如果退出腳本后,free顯示的占用內(nèi)存還在增大,可能是其它某個軟件在使用和分配內(nèi)存。
你根本就不必理會Lua的內(nèi)存釋放,它自己會工作都非常好。
內(nèi)存泄漏一般有可能出現(xiàn)在一些開發(fā)有缺陷的擴(kuò)展模塊上。Lua本身是不會有問題的。追問
您好,是在退出腳本后會釋放,能否在中間就進(jìn)行內(nèi)存的釋放呢?謝謝
追答99%的情況不用。
所有的腳本語言都會自己管理好內(nèi)存。
但如果是第三方寫的擴(kuò)展,就取決于這個擴(kuò)展是不是有bug導(dǎo)致內(nèi)存泄漏了。
至于Linux,就更不用說了。假如你有512M的內(nèi)存,跑http服務(wù)的話,你用free經(jīng)??吹街皇O?0M左右的空閑內(nèi)存,但Linux系統(tǒng)會工作得很好。而有時Linux又會突然“真正”釋放內(nèi)存,free里面又顯示出有100M左右的空閑內(nèi)存。
存儲管理是操作系統(tǒng)的核心任務(wù)之一,它是動態(tài)管理,普通用戶根本就不用關(guān)心。
為什么lua語言中使用全局變量就會造成內(nèi)存泄漏
題目說法本身不正確.全局變量不一定造成內(nèi)存泄露,只是可能導(dǎo)致多線程不安全。在創(chuàng)建多個lua虛擬機的時候會2個線程同時操作一個變量。這是你代碼設(shè)計問題
如果一定導(dǎo)致內(nèi)存泄露,那么就不可能存在全局變量了.
為什么lua語言中使用全局變量就會造成內(nèi)存泄漏呢??
導(dǎo)致多線程不安全。不一定會造成泄露。在創(chuàng)建多個lua虛擬機的時候會2個線程同時操作一個變量。這是你代碼設(shè)計問題至于如何發(fā)現(xiàn)內(nèi)存泄漏,也簡單說一下,如果是陌生代碼,或者雖然是你的,但你也懶得猜哪里泄漏了,那么請參考云風(fēng)的泄漏檢查工具:http://blog.codingnow.com/2012/12/lua_snapshot.html
如果代碼的大體邏輯比較熟悉,則可以使用弱引用表來檢查是否存在泄漏。通常產(chǎn)生泄漏的都是一些被反復(fù)創(chuàng)建的類型,例如游戲里的怪物(打死了就刷一個新的)、玩家(有人登錄就要創(chuàng)建一個新的玩家對象),這些東西由于在程序運行周期里反復(fù)地創(chuàng)建、銷毀,所以一旦有銷毀不干凈的情況,就容易導(dǎo)致明顯的內(nèi)存泄漏。那么探查這些對象是否存在泄漏,就有一個較為簡單的辦法,即:弱引用表。(如果你不知道什么是弱引用,請點擊這里)。
為了發(fā)現(xiàn)內(nèi)存泄漏,我們可以創(chuàng)建一個全局的弱引用table,使其key為弱引用,然后在每次創(chuàng)建那些可能存在泄漏的對象的時候,都放入這個table,讓其作為key,value通常我會用當(dāng)前時間。由于弱引用的性質(zhì),如果其他引用都消失了,那么在弱引用table中對這個對象的引用也會消失(變成nil),反之,只要還有其它任何一個引用存在,這個弱引用表中對這個對象的引用就繼續(xù)存在。依賴這個特性,當(dāng)程序已經(jīng)跑過釋放對象的邏輯后,如果這個表中還存在有這個對象的引用,那么這個對象肯定就是泄漏了。
說完了發(fā)現(xiàn)泄漏的方法,接下來輪到如何解決。其實我本來也想嘗試一下云大的snapshot,奈何這個項目用的是luajit,莫名其妙地不能require,時間緊迫,無法研究,只好作罷,另尋他法。不料一頓google下來除了snapshot之外幾乎沒有一個像樣的解決方案。情急之下,只好研究原理,自己動手,下面請看干貨:
既然內(nèi)存泄漏一定有引用沒清,那么基于lua的特性,這個引用一定存在于_G下面的某個table或者function的upvalue中(想不明白這個的同學(xué)請想明白再往下看),既然第一步的方法可以定位泄漏,而且還可以得到泄漏對象的引用,那么事情就好辦多了。無非就是得到引用之后遍歷_G,找到這個引用,并且把層級列出來,方便知道這個東西到底在哪里,想解決就好辦的多了。實現(xiàn)方法就不多說了,看代碼最直接。下面代碼中,調(diào)用findObjectInGlobal(泄漏對象的引用),即可找到一切非局部變量的歸屬關(guān)系。
local findedObjMap = nil
function _G.findObject(obj, findDest)
if findDest == nil then
return false
end
if findedObjMap[findDest] ~= nil then
return false
end
findedObjMap[findDest] = true
local destType = type(findDest)
if destType == "table" then
if findDest == _G.CMemoryDebug then
return false
end
for key, value in pairs(findDest) do
if key == obj or value == obj then
_info("Finded Object")
return true
end
if findObject(obj, key) == true then
_info("table key")
return true
end
if findObject(obj, value) == true then
_info("key:["..tostring(key).."]")
return true
end
end
elseif destType == "function" then
local uvIndex = 1
while true do
local name, value = debug.getupvalue(findDest, uvIndex)
if name == nil then
break
end
if findObject(obj, value) == true then
_info("upvalue name:["..tostring(name).."]")
return true
end
uvIndex = uvIndex + 1
end
end
return false
end
function _G.findObjectInGlobal(obj)
findedObjMap = {}
setmetatable(findedObjMap, {__mode = "k"})
_G.findObject(obj, _G)
end
以上就是關(guān)于lua內(nèi)存泄漏排查相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
illustrator提高教程(illustrator 教程)
蘋果6splus官方參數(shù)表(蘋果6splus參數(shù)詳細(xì)參數(shù)配置)