gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:45:55 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com