Я сейчас создаю игровой движок и столкнулся с небольшой проблемой. Я нашел пару решений, но они настолько элегантны, насколько хотелось бы.
Вот проблема:
- Создание объекта A в движке
- Получить указатель на объект A - ObjectA *
- Уничтожить объект A
- ObjectA * становится висячим указателем
Использование shared_ptr - это не- go так как он может блокировать объекты, которые мы не хотим. В уничтожении объекта А нет ничего плохого, мне просто нужен способ проверить, есть ли у него.
У меня есть два решения этой проблемы:
Первое - просто возвращать суррогатный объект всякий раз, когда Вы хотите ссылку на объект. Этот суррогатный объект может иметь неявное преобразование в необработанный указатель, для случаев, когда мы точно знаем, что объект допустим. В тех случаях, когда мы храним ссылку дольше, мы будем использовать суррогатный объект, который в основном является просто указателем на указатель. Когда объект уничтожен, мы просто устанавливаем его указатель на nullptr
, который суррогат сможет проверить на
Второе решение - вообще не возвращать указатели. Вместо этого, всякий раз, когда мы хотим ссылку на объект, мы передаем указатель, которому мы хотим назначить его в качестве параметра. Затем движок сохранит указанный указатель в памяти и вручную установит его на nullptr
, когда объект будет уничтожен.
Вот требования к моему предпочтительному элегантному решению:
- Используется только необработанные указатели для ссылок
- Указанные необработанные указатели возвращаются из вызовов функций (т.е.
Ptr* AddCompoenent<>()
вместо void AddComponent<>(Ptr*&)
- Указатели станут
nullptr
, когда объект, на который они указывают, уничтожен
Это вообще возможно?