我试图在一个现有的C应用程序中嵌入lua,并通过继承一个完成工作的类为它做了一个标准的过程. 我看到的一个严重问题是,如果暴露的对象在C环境中被解除分配或删除,那么来自Lua的调用
我看到的一个严重问题是,如果暴露的对象在C环境中被解除分配或删除,那么来自Lua的调用将导致崩溃.如果程序使用’delete’删除内存,那么我也可以在delete上编写一个包装器来处理Lua中的deallocation,但是如果内存是由C分配的,并且在适当的变量超出范围时解除分配我没有看到如何找到它然后在lua空间采取适当行动的方法,任何人对此有什么想法?
谢谢.
通常,几乎每个Lua包装器都有某种方式来决定谁拥有什么内存.也就是说,对象是由Lua还是由您的应用程序拥有(因此将被删除).如果你给Lua一个指向C拥有的对象的指针,那么你必须找到一种方法来确保Lua不会使用这个指针超过C删除它的点.有几种方法可以避免这种情况.一种方法是将所有权转让给Lua.
另一种方法是使用boost / std :: shared_ptr,它允许您在C和Lua之间共享所有权.如果您手动执行此操作,那么您将创建一些非轻量级用户数据,该数据大小与Lua中的shared_ptr相同.你附加了一个清理metame方法,它会破坏shared_ptr,你使用placement-new在Lua userdata上构造shared_ptr. Luabind实际上有这个内置功能:如果你将shared_ptr传递给Lua,那么它们都共享内存的所有权.
你也可以使用boost / std :: weak_ptr.这是您查询以获取shared_ptr的对象.这个想法是你不应该把指针放在身边;您可以根据需要临时查询它,但只能永久存储weak_ptr.如果对象丢失了所有shared_ptr引用,则查询weak_ptr将返回空指针.