0

编辑#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 RemoveDisplayObjectCreateDisplayObject

有一些额外的功能,可以DisplayObject像移动它一样工作,没有堆损坏。

卢阿:

另一个包装 Lua 绑定类的类

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

在某一时刻,引擎将加载一个额外的 lua 文件,该文件在 lua 类上调用 Remove()。

4

1 回答 1

3

来自 Luabridge 的自述文件:

不支持:

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

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

于 2013-04-26T14:34:38.533 回答