Редактировать № 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.
Из Readme Луабриджа:
Не поддерживается:
- Стандартные контейнеры, такие как
std::shared_ptr
, (Так!)
Так что, скорее всего, тот факт, что вы используете unique_ptr
полностью разрушает это. Я рекомендую переключиться на другую библиотеку привязок; или даже написать что-то простое самостоятельно.
Других решений пока нет …