2013-04-26 51 views
0
堆损坏(_CrtIsValidHeapPointer)

编辑#3:Luabridge:上删除

我的引擎是建立在以下方式:

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中的游戏循环将循环显示对象并执行各种任务。当LUA调用RemoveDisplayObject()_CrtIsValidHeapPointer时发生。

我们正在移除LUA对象之外的项目,这是否会导致问题?

什么会导致堆错误?我应该采取不同的方式吗?


这里是在发动机中的逻辑:

游戏(单件)

包含DisplayObjects(的DisplayObject矢量)

的Lua绑定类:

致电Game::SingletonCreateDisplayObject,获取指针指向最后一个对象在DisplayObjects

具有Remove()函数,它们调用Game::SingletonRemoveDisplayObjectCreateDisplayObject < ---- 传递指针这导致堆损坏(调用vector.clear时())。因此,从矢量中删除项目会导致堆错误。

有一些额外的功能与DisplayObject一起使用,如移动它,没有堆腐败。

的Lua:

另一类到包装了的Lua绑定类

包含Remove()函数调用的Lua绑定类删除()

在一个点上的发动机将加载一个额外的lua文件,它调用lua类的Remove()。

+2

如何为单个DisplayObject分配内存?你可以添加代码来分配和插入一个新的条目到'DisplayObjects'中吗?当更改为原始指针时,clear()不会“删除”它们导致内存泄漏。 – hmjd 2013-04-26 08:01:56

+0

向我们展示您的绑定代码以及 – 2013-04-26 08:35:58

+1

我认为问题是绑定,而不是Lua本身和/或指针类型。 – 2013-04-26 09:09:43

回答

3

从Luabridge自述:

不支持:

  • 标准容器,如std::shared_ptr(原文如此!)

所以最可能的是,你正在使用unique_ptr事实完全摧毁它。我建议切换到其他绑定库;甚至自己写一些简单的东西。

+1

是否没有_extension point_/_customization hook_/_derefence trait_ for this ?! o.O – sehe 2013-04-26 14:36:47

+0

我试过用原始指针和相同的问题发生,删除对象时堆损坏。我试图用较小的代码重现此错误,但它工作正常。我的绑定代码现在非常大,所以它可能是别的东西......我只是不能用手指。 – Grapes 2013-04-26 14:37:41

+0

虽然我自己正在积极研究一个这样的项目,但是[Lundi](https://github.com/lundiorg/lundi)目前有点不稳定,但是无论如何,您可能想要尝试一下(是的,它已经过测试! )。在有人指出这一点之前,免责声明:这是一个开源项目,我绝对没有收入,并且在我的空闲时间做。我真的认为它可以帮助OP。如果这仍然不适合你,请发表评论。 – 2013-04-26 14:43:54