c++ - Luabridge:删除时堆损坏(_CrtIsValidHeapPointer)

标签 c++ c++11 lua luabridge

编辑#3:

我的引擎是按以下方式设置的:

struct Engine {
    GetEngine()....//Singleton;
    std::vector<std::unique_ptr<DisplayObject>> DisplayObjects;
};

然后我写了几个lua接口(interface),如下:

 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();
    }
};

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

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

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


这是引擎中的逻辑:

游戏(单例)

包含 DisplayObjects(DisplayObject 的 vector )

Lua 绑定(bind)类:

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

具有调用 Game::Singleton RemoveDisplayObject 并从 CreateDisplayObject 传递指针的 Remove() 函数 < ---- 这会导致堆损坏(调用 vector.clear() 时)。因此从 vector 中删除项目会导致堆错误。

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

Lua:

另一个包装 Lua 绑定(bind)类的类

包含 Remove() 函数调用 Lua Bound Class Remove()

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

最佳答案

来自 Luabridge 的自述文件:

Not supported:

  • Standard containers like std::shared_ptr. (sic!)

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

关于c++ - Luabridge:删除时堆损坏(_CrtIsValidHeapPointer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16231401/

相关文章:

C++ TCP 客户端 - 接受一个 float 和一个数学运算符

c++ - 图像从 24 bpp 格式转换为 16 bpp 格式

debugging - 如何调试nginx配置中的lua代码?

c++ - 一些运算符是 Lua 不允许的

c++ - 通过 boost lambda 占位符访问成员变量

javascript - 如何在 Cheerp(C++ 到 JavaScript 转换器)中保留变量名称

c++ - 为什么 `std::exit` 没有按预期触发析构函数?

c++ - 初始化原子指针是原子的吗?如果初始化或内存分配抛出会发生什么?

c++ - 不同的 IDE 产生 0 个错误与 28 个错误

lua - 如何根据 Redis 中的另一个 SET 按其 concat 值过滤任何 SET