gpt4 book ai didi

memory - Lua表内存泄漏?

转载 作者:行者123 更新时间:2023-12-02 10:00:48 25 4
gpt4 key购买 nike

我遇到了关于lua table的使用的内存泄漏问题,代码如下:

function workerProc()
-- a table holds some objects (userdata, the __gc is implememted correctly)
local objs = {createObj(), createObj(), ...}
while isWorking() do
-- ...
local query = {unpack(objs)}
repeat
-- ...
table.remove(query, queryIndex)
until #query == 0
sleep(1000)
end
end

objs是用一些userdata对象初始化的,这些对象在while循环中始终可用,因此不会对这些obj执行gc。在 while 循环中,query 表使用 objs 中的所有元素进行初始化(使用 unpack 函数)。运行脚本时,我发现内存不断增加,但是当我注释掉 local query = {unpack(objs)} 时,它就消失了。

我不认为这段代码存在内存泄漏问题,因为 query var 是本地的,并且在 while 循环的每次迭代后它应该不可用,但事实是。有人知道为什么内存被那张 table 吞噬吗?

最佳答案

从您的代码示例来看,您所看到的情况的可能解释是 gc 在循环内可能没有机会执行完整的收集周期。

您可以使用 collectgarbage() 在内循环之后强制进行收集,看看是否可以解决内存问题:

while isWorking() do
-- ..
local query = {unpack(objs)}
repeat
-- ..
table.remove(query, queryIndex)
until #query == 0
collectgarbage()
sleep(1000)
end

另一种可能性是将本地查询移到循环之外并创建一次表,而不是在外部循环的每次迭代中创建一个新表。

关于memory - Lua表内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com