![]() |
1
5
我认为你的Lua方面没有问题,你不应该在那里解决它。 您的C++代码正在删除仍在引用的对象。不管它们是如何被引用的,那都很糟糕。
|
![]() |
2
4
我们公司采用了第四种解决方案,对我们来说效果很好。我推荐它。但是,为了完整性: 1号是实心的。让飞船的析构函数调用一些月球代码(或者标记它无论如何都应该被调用),然后如果你找不到它就抱怨。这样做意味着您必须非常小心,如果您想在单独的线程中运行游戏引擎和机器人,可能需要稍微修改Lua运行时。 第2号并不像你想象的那么难:在C++侧写或借用一个引用计数指针,如果你的Lua /C++胶习惯于处理C++指针,它可能会不需要进一步的干预,除非你在运行时或通过检查符号表来生成绑定。问题是,它会迫使你的设计发生相当深刻的变化;如果你使用引用计数指针来引用飞船,你必须在任何地方都使用它们——引用混合了裸指针和智能指针的飞船所固有的风险应该是显而易见的。所以我不会走那条路,不会像你看起来那么晚。 第三个问题很棘手。您需要一种方法来确定给定的ship对象是活的还是死的,即使在表示它的内存被释放之后也是如此。我能想到的解决这个问题的所有方法基本上都可以归结为第4种:你可以让死船留下某种标记,它被复制到Lua对象中,可以用来检测死亡(你可以把死船保存在一个std::set或类似的东西中),但是为什么不通过它们的标记来引用船呢?
|
![]() |
3
2
这是一个古老的问题,但国际海事组织,正确的解决办法是
重要的是,不要忘记取消分配
不要忘记使用宏或模板元编程来避免代码重复:
使用
|
![]() |
4
0
我同意 MSalters 我真的不认为你应该把内存从C++端释放出来。LuaUserData支持__; gc元方法,让您有机会进行清理。如果gc不够强大,您可以稍微调整它,或者更经常地以小步数手动运行它。lua-gc不是确定性的,因此如果需要释放资源,则需要有一个可以调用的函数来释放这些资源(也将由uu-gc调用,并进行适当的检查)。 weak tables 对于您的飞船引用,这样您就不必将每个引用都分配给nil来释放它。如果有一个强引用(例如,在所有活动船舶的列表中),那么所有其他船舶都是弱引用。当一艘船被摧毁时,在船上设置一个标记该船的标志,然后在active ships表中将引用设置为nil。然后,当另一艘船想要互动时,你的逻辑是相同的,除了你检查:
|
![]() |
Daniel Wagner · 如何使用带有管道的luv? 5 月前 |
|
Naruto_333 · Roblox:函数不循环或添加“货币”值 5 月前 |
![]() |
Lukas Raby · 玩Tween后,零件位置被锁定 9 月前 |
![]() |
Noway · 为什么roblox工作室在桌子上走错了路 11 月前 |
![]() |
localhorst · 索引处的铁路超高访问表条目 11 月前 |