Luabridge:在删除时出现堆破坏(_CrtIsValidHeapPointer)

我的引擎设置如下:

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() {
        //仅作演示目的,我们将删除所有对象
        Engine::GetEngine().DisplayObjects.clear();
    }
};

引擎中的游戏循环将循环遍历DisplayObject并执行各种任务。当LUA调用RemoveDisplayObject()时,将出现_CrtIsValidHeapPointer错误。

我们正在删除LUA对象之外的项目,这是导致问题的原因吗?

什么可能会导致堆错误?我该如何处理这个问题?


这是引擎中的逻辑:

Game(Singleton)

包含DisplayObjectsDisplayObject的向量)

Lua绑定类:

调用Game::Singleton CreateDisplayObject,获取DisplayObjects中最后一个对象的指针

具有Remove()函数,该函数调用Game::Singleton RemoveDisplayObject并传递来自CreateDisplayObject的指针<---- 这会造成堆破坏(在调用vector.clear()时)。因此,从向量中删除项目导致了堆错误。

有一些额外的函数,可与DisplayObject一起使用,如将其移动,不会有堆破坏。

LUA:

另一个包装了LUA绑定类的类

包含Remove()函数,该函数调用LUA绑定类Remove()

引擎在某些时候会加载一个额外的LUA文件,该文件在LUA类上调用Remove()。

点赞
用户752976
用户752976

从 Luabridge 的 Readme 中:

不支持:

  • 标准容器,例如 std::shared_ptr(注:!)

所以最有可能的是,您使用的 unique_ptr 完全破坏了它。我建议切换到其他绑定库;甚至自己编写一些简单的东西。

2013-04-26 14:34:38