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