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