自定义 Lua 分配函数释放内存时抛出 COMException 异常

我正在尝试使用自定义分配函数来控制 Lua 使用的内存量,但是出现了 COMException 异常,说在释放内存时出现了无效参数的情况(HRESULT: 0x80000003),如果让创建字符串和扩展字符串的脚本运行几秒钟。这是我的自定义分配函数:

private static IntPtr Alloc(IntPtr ud, IntPtr ptr, int osize, int nsize)
{
    if (nsize == 0)
    {
        Marshal.FreeHGlobal(ptr);
        return IntPtr.Zero;
    }
    else
    {
        if (osize == 0)
            return Marshal.AllocHGlobal(nsize);
        else
            return Marshal.ReAllocHGlobal(ptr, (IntPtr)nsize);
    }
}

没有什么特别的事情发生,我只需使用 lua_setallocf 设置该函数,然后开始在循环中创建和连接字符串,以引起内存变化。使用 realloc 和 free 在托管 C++ 中发生了相同的事情,尽管我不知道它们是否实际上在幕后做了完全相同的事情。

如果使用 Lua 的默认分配函数,一切都可以正常工作。有没有人知道可能导致这种情况发生的原因?

更新: 我刚刚发现,这只会在使用 LuaJit 时发生,而不会在官方 Lua 5.1 二进制文件中发生......

原文链接 https://stackoverflow.com/questions/42193171

点赞