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::SingletonCreateDisplayObject, получает указатель на последний объект в DisplayObjects

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

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

Lua:

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

Содержит Remove() функция, которая вызывает Lua Bound Class Remove()

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам