Retour à la leçon
Mission

Mission : le serveur de simulation qui fuit sa mémoire

Diagnostiquer une fuite mémoire causée par des ressources C non attachées au garbage collector Lua, et sécuriser un cast FFI dangereux.

Contexte

Un moteur de simulation physique utilise LuaJIT et sa FFI pour allouer des buffers de calcul :

lua
local ffi = require("ffi")
ffi.cdef[[
void *malloc(size_t size);
void free(void *ptr);
]]

local function allocateBuffer(size)
  local ptr = ffi.C.malloc(size)   -- allocation manuelle, jamais libérée explicitement
  return ptr
end

for i = 1, 10000 do
  local buf = allocateBuffer(1024)   -- appelé à chaque frame de simulation
end

Après quelques minutes de simulation continue, le processus consomme des gigaoctets de mémoire et finit par planter, alors que collectgarbage("count") ne montre presque aucune mémoire Lua utilisée.