Правильный способ управления пользовательскими данными Lua light - PullRequest
0 голосов
/ 31 августа 2018

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

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

1 Ответ

0 голосов
/ 01 сентября 2018

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

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

...