массив интеллектуальных указателей

Я создал класс умного указателя, например:

template <class T>
class Owner
{
    T* m_p;
public:
    Owner(T *p=0) : m_p(p) {}
    ~Owner() { if (m_p) delete m_p; }
    T* operator ->() { return m_p; }
    T& operator *() { return *m_p; }
    // other members.
};

Это работает хорошо (напоминает auto_ptr в библиотеке boost), но теперь у меня есть требования, которые я хочу хранить динамический массив интеллектуальных указателей в объекте, и он должен поддерживать:

1) вставьте новый интеллектуальный указатель в массив интеллектуальных указателей, чтобы изменить размер массива и получить право собственности на новый объект,

2) удалить один умный указатель на лету и освободить ресурс,

3) при финализации массива удаляются все объекты.

Я думал об использовании std::vector<Owner<T> >, но, похоже, лучшая практика С++ предлагает не хранить интеллектуальные указатели в стандартных контейнерах из-за поведения копирования/назначения, так что еще я могу использовать для реализации этого? что-то вроде OwnerArr в приведенном ниже примере:

 class Adapter;

 class Computer
 { 
 public:
      Computer() {}
      ~Computer() { // adapters get freed automatically here. }

      void insertAdapter(Adapter* pAdapter) { m_adapters->appendOne(pAdapter); }
      OwnerArr<Adapter>   m_adapters;
 };

Заранее спасибо!


person Zhi Wang    schedule 13.09.2012    source источник
comment
Почему бы не использовать умные указатели, которые уже существуют? См., например. std::shared_ptr и std::unique_ptr.   -  person Some programmer dude    schedule 13.09.2012
comment
auto_ptr находится в стандартной библиотеке, а не в boost. Вам нужно shared_ptr (или unique_ptr, если вы можете использовать C++11.)   -  person kennytm    schedule 13.09.2012
comment
Вам нужен оператор копирования и оператор присваивания копирования (правило трех ). Вы должны разработать соответствующую политику передачи прав собственности. Помимо обучения, нет причин заново изобретать велосипед.   -  person Remus Rusanu    schedule 13.09.2012
comment
Если среди других участников нет копировщика и оператора присваивания копии, вы нарушаете правило трех. Здесь я полностью согласен с Иоахимом, Кенни и Ремусом. Чем ваш интеллектуальный указатель будет отличаться от unique_ptr или shared_ptr?   -  person sellibitze    schedule 13.09.2012
comment
Спасибо за все ваши комментарии! Да, я, конечно, могу использовать auto_ptr или другой стандартный интеллектуальный указатель, мой вопрос здесь о том, существуют ли инструменты массива интеллектуальных указателей?   -  person Zhi Wang    schedule 13.09.2012
comment
@ZhiWang и ответ, как упоминалось здесь ранее, Есть: std::unique_ptr.   -  person R. Martinho Fernandes    schedule 13.09.2012


Ответы (1)


Вы не можете хранить свои Owner или std::auto_ptr (которые вам все равно не следует использовать, так как они устарели) в стандартном контейнере, потому что они не могут быть скопированы.

В C++11 есть std::unique_ptr: интеллектуальный указатель с одним владельцем, заменяющий auto_ptr, который можно перемещать, но нельзя копировать. Это можно переместить или поместить в любой контейнер, если вам не нужно делать ничего, что связано с его копированием. Если вам нужно несколько указателей для совместного владения одним и тем же объектом, вместо этого вы можете использовать std::shared_ptr.

Если по какой-то причине вы застряли на старой языковой версии, Boost может предоставить вам умные указатели, в том числе shared_ptr очень похожие на стандартные, или контейнеры указателей, похожие на ваши OwnerArray.

Если вы решите создать свои собственные классы управления ресурсами, всегда помните Правило трех. Классы, которые вы показываете, имеют неявно сгенерированные конструкторы копирования и операторы присваивания копирования, которые могут заставить два указателя владеть одним и тем же объектом и пытаться удалить его, что очень плохо. Вам нужно либо предотвратить копирование (удалив эти функции или (до 2011 года) объявив их частными без реализации), либо внедрить какую-то семантику безопасного копирования.

person Mike Seymour    schedule 13.09.2012
comment
Большое спасибо, я думаю, что контейнеры указателей могут меня заинтересовать. - person Zhi Wang; 14.09.2012