luajit qsort回调示例内存泄漏

时间:2013-06-19 12:32:23

标签: callback lua ffi qsort luajit

我有以下qsort示例来尝试luajit中的回调。但是它有内存泄漏(执行时luajit: not enough memory),这对我来说并不明显。

有人可以给我一些关于如何创建正确回调示例的提示吗?

local ffi = require("ffi")

-- ===============================================================================

ffi.cdef[[
    void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));
]]


function compare(a, b)
    return a[0] - b[0] 
end

-- ===============================================================================

-- Explicitly convert to a callback via cast
local callback = ffi.cast("int (*)(const char *, const char *)", compare)

local data     = "efghabcd"
local size     = 8 
local loopSize = 1000 * 1000 * 100.

local bytes    = ffi.new("char[15]")

-- ===============================================================================

for i=1,loopSize do 
    ffi.copy(bytes, data, size)
    ffi.C.qsort(bytes, size, 1, callback)
end

平台:OSX 10.8 luajit:2.0.1

1 个答案:

答案 0 :(得分:1)

问题似乎是lua永远不会有机会在紧密循环中执行完整的垃圾收集循环。正如评论所暗示的那样,您可以通过在循环内调用collectgarbage()来纠正此问题。

请注意,在每次迭代时调用collectgarbage()都会影响您正在进行的任何操作的运行时间。要最大限度地减少这种情况,您应该设置一个阈值来限制调用collectgarbage()的频率:

local memthreshold = 2 ^ 20 / 1024
local start = os.clock()
for i = 1, loopSize do
    ffi.copy(bytes, data, size)
    ffi.C.qsort(bytes, size, 1, callback)
    if collectgarbage'count' > memthreshold then
      collectgarbage()
    end
end
local elapse = os.clock() - start
print("elapsed:", elapse..'s')