Правильный способ управления пользовательскими данными Lua light

у меня есть void * C ++ созданному объекту, который я передаю Lua, используя lua_pushlightuserdata(), Lua может выполнить некоторые действия с этими легкими пользовательскими данными, передав их в Lua CFunctions и получив их с помощью lua_touserdata(), В какой-то момент в будущем объект C ++ разрушается его владельцем (C ++), освобождается память и устанавливается значение null. Однако у Lua есть ссылка на этот указатель, он не знает, что он был уничтожен.

Теперь мои функции Lua, которые принимают эти пользовательские данные, проверяют правильность указателя. Но как лучше всего сообщить Lua, что их ссылка на легкие пользовательские данные больше не действительна? Я выставляю IsValid(lightuserdata) функция Lua, чтобы он мог запросить статус? Или есть лучший подход, который я пропускаю.

3

Решение

По своему опыту я обнаружил, что Lua легче управлять объектами, и вам нужны полные пользовательские данные для хранения указателя или полного объекта в области памяти пользовательских данных. Полные пользовательские данные могут иметь метатабельный __gc метаметод, поэтому объекты будут уничтожены только после того, как последняя ссылка будет собрана мусором на стороне Lua.

По крайней мере, не выставляйте сырые указатели на нативные объекты Lua через lightuserdataна самом деле это не работает для управления временем жизни нативных объектов. Сделайте это каким-нибудь объектом, который принадлежит Lua. В простейшем случае это может быть объект Lua (полные пользовательские данные), содержащий смарт-указатель на настоящий нативный объект.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]