Луабридж: повреждение кучи (_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:

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

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

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

Lua:

Другой класс для обертывания связанного класса Lua

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

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


person Grapes    schedule 26.04.2013    source источник
comment
Как распределяется память для отдельных DisplayObjects? Можете ли вы добавить код, который выделяет и вставляет новую запись в DisplayObjects? При изменении на необработанный указатель clear() не delete приведет к утечке памяти.   -  person hmjd    schedule 26.04.2013
comment
покажите нам также свой код привязки   -  person Dmitry Ledentsov    schedule 26.04.2013
comment
Я думаю, что проблема связана с привязкой, а не с самим Lua и / или типом указателя.   -  person W.B.    schedule 26.04.2013
comment
Вы можете рассмотреть возможность использования другой привязки. Дело в том, что такая привязка целых классов весьма ограничена. (Я не защищаю, совсем нет! В качестве доказательства я не рекомендую ничего конкретного).   -  person Bartek Banachewicz    schedule 26.04.2013
comment
Пожалуйста, не меняйте вопрос так, чтобы он был совершенно другим. Если вы хотите задать другой вопрос, задайте другой вопрос. Также SO не собирается за вас отлаживать код.   -  person Bartek Banachewicz    schedule 26.04.2013
comment
Все указатели ControlObject подозрительно остаются висящими после очистки вектора в RemoveDisplayObject () - что вы делаете с ControlObject?   -  person Casey    schedule 27.04.2013


Ответы (1)


Из ознакомительных сведений Луабриджа:

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

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

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

person Bartek Banachewicz    schedule 26.04.2013
comment
Разве для этого не существует точки расширения / хука настройки / derefence trait ?! o.O - person sehe; 26.04.2013
comment
Я пробовал это с необработанными указателями, и возникает та же проблема, повреждение кучи при удалении объекта. Я попытался воспроизвести эту ошибку с меньшим кодом, но он работает нормально. Мой код привязки теперь довольно велик, так что это может быть что-то еще ... Я просто не могу его понять. - person Grapes; 26.04.2013
comment
Хотя я сам активно работаю над одним из таких проектов, Lundi в настоящее время немного нестабилен, но вы можете захотеть в любом случае дать ему шанс (да, это проверено!). И прежде, чем кто-то отметит это, отказ от ответственности: это проект с открытым исходным кодом, я не получаю от него никакого дохода и занимаюсь им в свободное время. Я честно думаю, что это может помочь ОП. Если вас по-прежнему не устраивает, оставьте комментарий. - person Bartek Banachewicz; 26.04.2013
comment
Если вы не можете воспроизвести его на более простом коде, @Grapes, попробуйте постепенно удалять код, пока не найдете бит, который действительно вызывает проблемы. - person Bartek Banachewicz; 26.04.2013
comment
Я реструктурировал свою логику и упростил логику удаления. Больше никаких ошибок кучи! Это было как-то связано с переопределением переменных переменных C ++ и переопределением функций. Фактическая ошибка все еще ускользает от меня, но, по крайней мере, я больше не получаю ошибок кучи. - person Grapes; 27.04.2013