Luabridge: повреждение кучи (_CrtIsValidHeapPointer) при удалении

Редактировать № 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 Bound Class:

Вызовы Game::Singleton CreateDisplayObject, получает указатель на последний объект в DisplayObjects

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

Имеет некоторые дополнительные функции, которые работают с DisplayObject как перемещать это, никакой коррупции кучи.

Lua:

Еще один класс для обёртывания Lua-связанного класса

Содержит Remove() функция, которая вызывает Связанный класс Lua Удалить ()

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

0

Решение

Из Readme Луабриджа:

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]