Есть ли простой и эффективный слабый/защищенный указатель? Мне нужно несколько указателей на один и тот же объект, которые автоматически устанавливаются в NULL при удалении объекта. Существует один «главный» указатель, который всегда используется для удаления объекта, но может быть и несколько других указателей, ссылающихся на один и тот же объект.
Вот некоторые решения, которые не совсем соответствуют моим потребностям:
- QPointer: я не разрабатываю приложение QT; Я не хочу включать эту библиотеку/производную от QObject.
- boost::weak_ptr:
исключение вызывается при доступе к освобожденному объекту. Слишком дорого для моей ситуации: проверка слабого указателя должна быть нормальной; Я планирую выполнить некоторую ручную очистку, когда слабый указатель перестанет быть действительным.update: weak_ptr можно протестировать без создания исключений. - Слабые указатели с низкими издержками: это очень близко к тому, что я ищу, за исключением того, что мне не нравится тот факт, что «Эта схема гарантированно работает только до тех пор, пока вы не выделяете 2 ** sizeof (int) раз в одном и том же месте».
Зачем мне нужны эти слабые/защищенные указатели: у меня есть игра со списком игровых объектов. Некоторые объекты зависят от других, например объект отладки/статистики, связанный с игровым объектом. Объект отладки/состояния отображает полезную информацию об игровом объекте, но это имеет смысл только тогда, когда игровой объект существует. Поэтому, если игровой объект удален, объект отладки/статистики должен понять это и удалить себя. (Еще одна идея — ракета сопровождения: вместо того, чтобы стирать себя, она может искать новую цель.)
Я хочу, чтобы логика отладки/статистики была отделена от игрового объекта. Игровой объект не должен знать, что к нему прикреплен объект отладки/статистики. Хотя я бы предпочел ответ для слабых/защищенных указателей, я также приветствую различные способы подхода к моей конкретной задаче. Я думаю, что мне, возможно, придется реализовать менеджер игровых объектов, который отслеживает время жизни объектов и использует дескрипторы вместо необработанных указателей на адреса памяти.
Я разрабатываю на С++.
std::weak_ptr
. Похоже на тот, что у Boost. - person Palec   schedule 03.08.2017