Я создал класс умного указателя, например:
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;
};
Заранее спасибо!
std::shared_ptr
иstd::unique_ptr
. - person Some programmer dude   schedule 13.09.2012auto_ptr
находится в стандартной библиотеке, а не в boost. Вам нужноshared_ptr
(илиunique_ptr
, если вы можете использовать C++11.) - person kennytm   schedule 13.09.2012std::unique_ptr
. - person R. Martinho Fernandes   schedule 13.09.2012