Редактировать # 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.
DisplayObject
s? Можете ли вы добавить код, который выделяет и вставляет новую запись вDisplayObjects
? При изменении на необработанный указательclear()
неdelete
приведет к утечке памяти. - person hmjd   schedule 26.04.2013