编辑#3:
我的引擎按以下方式设置:
struct Engine {
GetEngine()....//Singleton;
std::vector<std::unique_ptr<DisplayObject>> DisplayObjects;
};
然后我按以下方式编写一些lua接口:
struct LuaObject {
DisplayObject* ControlObject;
void Initialize() {
auto NewObject=make_unique<DisplayObject>();
Engine::GetEngine().DisplayObjects.push_back(std::move(NewObject));
ControlObject=Engine::GetEngine().DisplayObjects.back().get();
}
void RemoveDisplayObject() {
//we remove all objects just for a demonstration
Engine::GetEngine().DisplayObjects.clear();
}
};
Engine中的游戏循环将遍历DisplayObject并执行各种任务。当LUA调用RemoveDisplayObject()_CrtIsValidHeapPointer时。
我们正在删除LUA对象之外的项目,这会导致问题吗?
什么会导致堆错误?我应该采用不同的方法吗?
以下是引擎中的逻辑:
游戏(单身人士)
包含DisplayObjects
(向量DisplayObject
)
Lua Bound Class:
致电Game::Singleton
CreateDisplayObject
,获取指向DisplayObjects
具有Remove()
函数,该函数调用Game::Singleton
RemoveDisplayObject
并传递指针CreateDisplayObject
&lt; ---- 这会导致堆损坏(调用向量时)。明确())。因此从向量中删除项会导致堆错误。
有一些额外的功能可以与DisplayObject
一起使用,就像移动它一样,没有堆损坏。
的Lua:
包装Lua绑定类的另一个类
包含Remove()
函数,该函数调用 Lua Bound Class Remove()
引擎会在某一时刻加载一个额外的lua文件,该文件在lua类上调用Remove()。
答案 0 :(得分:3)
来自Luabridge的自述:
不支持:
std::shared_ptr
等标准容器。 (原文如此!)
所以很可能,你使用unique_ptr
的事实完全是在摧毁它。我建议切换到其他一些绑定库;甚至自己写一些简单的东西。