Кароч. Есть два метода передачи значений в луа.
1. light_userdata — это просто указатель на какую-то структуру. Считай что просто некоторое число. Память под этим указателем должна быть под управлением сишки, сборка мусора её не соберёт, но при множественном пропихивании одного и того же указателя, их можно сравнивать на равенство и на луёвой стороне: допустим, мы с сишки пропихиваем событие и указатель на окно, и события одного и того же окна всегда с одним и тем же указателем. С полной юзердатой такое бы не сработало.
2. Полная юзердата — это выделение памяти на луёвой стороне. Грубо говоря, ты маллокаешь кусочек места, пихаешь в него данные, опционально присоединяешь метатаблицу и луа начинает управлять его памятью: данное значение будет собрано сборкой мусора, когда на *луашной* стороне больше не останется ссылок на данный объект.
Советую использовать фулл-юзердату во всех случаях когда возможно, и изначально организовывать своё приложение таким образом, чтобы луа управляла созданием и сборкой мусора.