【问题标题】:Luabridge: heap corruption (_CrtIsValidHeapPointer) on removeLuabridge:删除时堆损坏(_CrtIsValidHeapPointer)
【发布时间】:2013-04-20 07:55:53
【问题描述】:

编辑#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 对象之外的项目,这是导致问题的原因吗?

什么会导致堆错误?我应该以不同的方式处理这个问题吗?


这是引擎中的逻辑:

游戏(单机)

包含DisplayObjectsDisplayObject 的向量)

Lua 绑定类:

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

具有Remove() 函数,该函数调用Game::Singleton RemoveDisplayObject 并从CreateDisplayObject 传递指针这会导致堆损坏(调用vector.clear() 时)。所以从向量中删除项目会导致堆错误。

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

Lua:

另一个包装 Lua 绑定类的类

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

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

【问题讨论】:

  • 个人DisplayObjects的内存是如何分配的?你能添加代码来分配和插入一个新条目到DisplayObjects吗?当更改为原始指针时,clear() 不会 delete 它们导致内存泄漏。
  • 也向我们展示您的绑定代码
  • 我认为问题在于绑定,而不是 Lua 本身和/或指针类型。
  • 您可以考虑使用其他绑定。关键是,像这样绑定整个类是非常有限的。 (我不提倡,一点也不!作为证明,我不特别推荐任何人)。
  • 请不要以完全不同的方式更改问题。如果您想问另一个问题,请再问一个问题。 SO也不会为你调试代码。

标签: c++ c++11 lua luabridge


【解决方案1】:

来自 Luabridge 的自述文件:

不支持:

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

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

【讨论】:

  • 没有扩展点 / 自定义钩子 / derefence trait吗?! o.O
  • 我用原始指针尝试过,同样的问题发生了,删除对象时堆损坏。我试图用更小的代码重现这个错误,但它工作正常。我的绑定代码现在非常大,所以它可能是别的东西……我只是无法指望它。
  • 虽然我自己正在积极地从事这样一个项目,Lundi 目前有点不稳定,但你可能还是想试一试(是的,它已经过测试了!)。在有人指出这一点之前,免责声明:这是一个开源项目,我绝对没有从中获得任何收入,而是在空闲时间做这件事。老实说,我认为它可以帮助OP。如果您仍然不满意,请发表评论。
  • 如果您无法在更简单的代码上重现它,@Grapes,请尝试逐步删除代码,直到找到真正导致问题的位。
  • 我重构了我的逻辑并简化了删除逻辑。没有更多的堆错误!它与重新分配变量 C++ 变量和重新定义函数有关。实际的错误仍然让我无法理解,但至少我不再遇到堆错误了。
猜你喜欢
  • 2013-06-04
  • 2013-01-23
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2019-08-28
相关资源
最近更新 更多