luajit qsort回调示例内存泄漏

我有一个 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

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

-- 显式转换为回调(通过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

点赞
用户234175
用户234175

问题似乎是 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')
2013-07-07 21:19:30