C ++: доступ к контейнеру shared_ptr должен возвращать raw или shared ptr? - PullRequest
3 голосов
/ 08 октября 2010

Если я использую контейнер shared_ptrs и явно разрешаю доступ к его элементам, должен ли я возвращать shared_ptrs или необработанные указатели, если я хочу, чтобы контейнер отвечал за «очистку»?

class Container
{
private:
    std:vector<shared_ptr<Foo> > foo_ptrs;

public:
    shared_ptr<Foo> operator[](std::size_t index) const {}; // or
    Foo* operator[](std::size_t index) const {};
};

Есть ли причина возвращать shared_ptrs в такой ситуации, или все указатели в порядке?

Привет!

Ответы [ 3 ]

2 голосов
/ 08 октября 2010

возвращает ссылку

Возвращает shared_ptr только в том случае, если вы намерены получить доступ к управлению жизненным циклом.Это правильный дизайн, но, как вы сказали, Container несет полную ответственность за очистку.shared_ptr - это просто деталь реализации Containter, тот факт, что для реализации контейнера используется vector из shared_ptr s, не должен отображаться через интерфейс.

Невернуть указатель, если нет смысла получать NULL из Container.Обычно это не так.Все, что хочет пользователь, - это доступ к i-тому элементу контейнера, и ссылка делает это отлично.

То, что вы действительно хотите, это std::vector<std::unique_ptr<Foo>>.Container - это тот, кто управляет памятью и говорит об этом в объявлении члена.Все остальные не имеют никакого дела, зная реализацию.

Посмотрите Boost.Pointainers , если вы не хотите или не можете использовать C ++ 0x.

2 голосов
/ 08 октября 2010

То, что вы, вероятно, «должны» вернуть в этом случае, является boost :: weak_ptr <>, который дает вам семантику, которую вы описываете (если контейнер сохраняет владение, объект может быть удален после выдачи внешней ссылки) , и вы можете безопасно обнаружить, если объект все еще действителен при внешнем использовании). Конечно, для этого необходимо использовать boost :: shared_ptr <>, так что это может быть неприменимо для вашей ситуации.

Надеюсь, что это поможет, даже если вы не сможете его использовать.

2 голосов
/ 08 октября 2010

Вы должны вернуть shared_ptr, если хотите продолжать использовать объект, не беспокоясь о стирании элемента контейнера.

В противном случае вы можете получить осиротевший необработанный указатель после того, как какой-либо другой пользователь контейнера очистит контейнер или удалит элемент, на который вы ссылаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...