【发布时间】:2013-04-20 07:55:53
【问题描述】:
编辑#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::SingletonCreateDisplayObject,获取指向DisplayObjects中最后一个对象的指针
具有Remove() 函数,该函数调用Game::Singleton RemoveDisplayObject 并从CreateDisplayObject 传递指针这会导致堆损坏(调用vector.clear() 时)。所以从向量中删除项目会导致堆错误。
有一些额外的功能可以与DisplayObject 一起使用,比如移动它,没有堆损坏。
Lua:
另一个包装 Lua 绑定类的类
包含Remove() 函数调用Lua Bound Class Remove()
在某一时刻,引擎将加载一个额外的 lua 文件,该文件在 lua 类上调用 Remove()。
【问题讨论】:
-
个人
DisplayObjects的内存是如何分配的?你能添加代码来分配和插入一个新条目到DisplayObjects吗?当更改为原始指针时,clear()不会delete它们导致内存泄漏。 -
也向我们展示您的绑定代码
-
我认为问题在于绑定,而不是 Lua 本身和/或指针类型。
-
您可以考虑使用其他绑定。关键是,像这样绑定整个类是非常有限的。 (我不提倡,一点也不!作为证明,我不特别推荐任何人)。
-
请不要以完全不同的方式更改问题。如果您想问另一个问题,请再问一个问题。 SO也不会为你调试代码。