编辑#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 绑定类:
调用Game::Singleton
CreateDisplayObject
,获取指向最后一个对象的指针DisplayObjects
具有从<----调用和传递指针的Remove()
函数这会导致堆损坏(调用 vector.clear() 时)。因此从向量中删除项目会导致堆错误。Game::Singleton
RemoveDisplayObject
CreateDisplayObject
有一些额外的功能,可以DisplayObject
像移动它一样工作,没有堆损坏。
卢阿:
另一个包装 Lua 绑定类的类
包含Remove()
调用Lua 绑定类 Remove()的函数
在某一时刻,引擎将加载一个额外的 lua 文件,该文件在 lua 类上调用 Remove()。