у меня есть void *
C ++ созданному объекту, который я передаю Lua, используя lua_pushlightuserdata()
, Lua может выполнить некоторые действия с этими легкими пользовательскими данными, передав их в Lua CFunctions и получив их с помощью lua_touserdata()
, В какой-то момент в будущем объект C ++ разрушается его владельцем (C ++), освобождается память и устанавливается значение null. Однако у Lua есть ссылка на этот указатель, он не знает, что он был уничтожен.
Теперь мои функции Lua, которые принимают эти пользовательские данные, проверяют правильность указателя. Но как лучше всего сообщить Lua, что их ссылка на легкие пользовательские данные больше не действительна? Я выставляю IsValid(lightuserdata)
функция Lua, чтобы он мог запросить статус? Или есть лучший подход, который я пропускаю.
По своему опыту я обнаружил, что Lua легче управлять объектами, и вам нужны полные пользовательские данные для хранения указателя или полного объекта в области памяти пользовательских данных. Полные пользовательские данные могут иметь метатабельный __gc
метаметод, поэтому объекты будут уничтожены только после того, как последняя ссылка будет собрана мусором на стороне Lua.
По крайней мере, не выставляйте сырые указатели на нативные объекты Lua через lightuserdata
на самом деле это не работает для управления временем жизни нативных объектов. Сделайте это каким-нибудь объектом, который принадлежит Lua. В простейшем случае это может быть объект Lua (полные пользовательские данные), содержащий смарт-указатель на настоящий нативный объект.
Других решений пока нет …