2013-04-26 5 views
0

Edit # 3: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() { 
     //we remove all objects just for a demonstration 
     Engine::GetEngine().DisplayObjects.clear(); 
    } 
}; 

Игровой цикл в Engine будет проходить через DisplayObject и выполнять различные задачи. Когда LUA вызывает RemoveDisplayObject() _CrtIsValidHeapPointer.

Мы удаляем элементы, которые находятся за пределами объекта LUA, вызывает ли это проблему?

Что может вызвать ошибку кучи? Должен ли я подходить к этому по-другому?


Вот логика в двигателе:

игры (Singleton)

Содержит DisplayObjects (вектор DisplayObject)

Lua Bound Класс:

Звонки Game::SingletonCreateDisplayObject, получает указатель на последний объект в DisplayObjects

Имеет Remove() функцию, которая вызывает Game::SingletonRemoveDisplayObject и передает указатель из CreateDisplayObject < ---- Это вызывает повреждение кучи (при вызове vector.clear()). Поэтому удаление элементов из вектора вызывает ошибку кучи.

Имеет некоторые дополнительные функции, которые работают с DisplayObject, как перемещение вокруг, без повреждения кучи.

Lua:

Другой класс оборачивает Lua Bound класс

содержит Remove() функцию, которая вызывает Lua Bound Класс Remove()

В один момент двигатель будет загружать дополнительный lua, который вызывает Remove() в классе lua.

+2

Какова память, выделенная для отдельного 'DisplayObject'? Можете ли вы добавить код, который выделяет и вставляет новую запись в 'DisplayObjects'? При изменении на необработанный указатель 'clear()' не будет «удалять» их, что приведет к утечке памяти. – hmjd

+0

покажите нам свой код привязки –

+1

Я думаю, что проблема связана со связыванием, а не с самим Lua и/или с указателем. –

ответ

3

С Readme Luabridge по:

Не поддерживается:

  • Стандартные контейнеры, как std::shared_ptr. (sic!)

Так что, скорее всего, тот факт, вы используете unique_ptr полностью уничтожить его. Я рекомендую переключиться на другую библиотеку привязки; или даже писать что-то простое.

+1

Нет ли _extension point_/_customization hook_/_derefence trait_ для этого ?! o.O – sehe

+0

Я пробовал это с необработанными указателями, и возникает одна и та же проблема, повреждение кучи при удалении объекта. Я попытался воспроизвести эту ошибку с меньшим кодом, но он отлично работает. Мой привязывающий код сейчас довольно велик, так что это может быть что-то другое ... Я просто не могу на него пальцем. – Grapes

+0

Пока я активно работаю над одним из таких проектов, [Lundi] (https://github.com/lundiorg/lundi) в настоящее время немного нестабилен, но вы, возможно, захотите дать ему шанс (да, он протестирован!). И перед тем, как кто-то отметит это, отказ от ответственности: это проект с открытым исходным кодом, я получаю от него абсолютно никакой доход и делаю это в свободное время. Я честно думаю, что это может помочь ОП. Если вам все еще не нравится, напишите комментарий. –

Смежные вопросы