Обычно я следую руководству по стилю Google, которое, как мне кажется, хорошо согласуется с тем, как я вижу вещи. Я также почти исключительно использую boost :: scoped_ptr, чтобы только один менеджер владел определенным объектом. Затем я передаю голые указатели, идея в том, что мои проекты структурированы таким образом, что менеджеры указанных объектов всегда уничтожаются после уничтожения объектов, которые их используют.
http://google -styleguide.googlecode.com / SVN / багажник / cppguide.xml # Smart_Pointers
Это все замечательно, однако меня укусила небольшая неприятная ошибка, связанная с тем, что владелец просто так удалился до того, как объекты, которые его использовали, были удалены.
Теперь, прежде чем все подпрыгнут, что я дурак для этого паттерна, почему бы мне просто не использовать shared_ptr? и т.д., учтите, что я не хочу иметь неопределенную семантику владельца. Хотя shared_ptr поймал бы этот конкретный случай, он отправляет неверное сообщение пользователям системы. Там написано: «Я не знаю, кому это принадлежит, это может быть ты!»
Что бы мне помогло, был бы слабый указатель на указатель в области видимости. По сути, указатель с областью действия, имеющий список слабых ссылок, которые обнуляются, когда указатель с областью действия разрушается. Это позволит использовать семантику единого владельца, но даст возможность использующим объектам уловить проблему, с которой я столкнулся.
Таким образом, за счет дополнительного указателя 'weak_refs' для scoped_ptr и дополнительного указателя для 'next_weak_ptr' в weak_ptr, это сделало бы аккуратного маленького единственного владельца структурой с несколькими пользователями.
Возможно, это может быть просто функция отладки, поэтому в «выпуске» вся система просто превращается в scoped_ptr обычного размера и стандартный одиночный указатель для слабой ссылки.
Итак ..... мои вопросы после всего этого:
- Есть ли такой указатель / паттен уже в stl / boost, что я
отсутствует, или я должен просто свернуть свой собственный?
- Есть ли лучший способ
все еще отвечает моей единственной цели владения?
Ура,
Шейн