智能指针数组

时间:2012-09-13 10:20:43

标签: c++ pointers ownership

我创建了一个智能指针类,如:

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.
};

它运行良好(类似于boost库中的auto_ptr),但现在我有一些要求,我想在obj中存储一个动态的智能指针数组,它必须支持:

1)将新的智能指针插入智能指针数组,让数组调整大小并获得新obj的所有权,

2)动态删除一个智能指针,释放资源,

3)在最终确定数组时,所有对象都会被删除。

我在考虑使用std::vector<Owner<T> >,但似乎c ++最佳实践建议不要在std容器中存储智能指针,因为复制/分配行为,那么我可以用什么其他东西来实现呢?类似于以下示例中的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;
 };

提前致谢!

1 个答案:

答案 0 :(得分:0)

您无法在标准容器中存储您的Ownerstd::auto_ptr(您不应该使用它,因为它已被弃用),因为它们不是真正可复制的。

在C ++ 11中,有std::unique_ptr:一个单一所有权智能指针,用于替换auto_ptr,它是可移动但不可复制的。只要您不需要执行任何涉及复制它的操作,就可以将其移动或放置到任何容器中。如果您需要多个指针来共享同一对象的所有权,那么您可以改为使用std::shared_ptr

如果由于某种原因您使用的是较旧的语言版本,那么Boost可以为您提供smart pointers,包括与{1}}非常相似的shared_ptr,或类似于pointer containers你的OwnerArray

如果您决定推出自己的资源管理类,请始终记住Rule of Three。您显示的类隐式生成了复制构造函数和复制赋值运算符,它们可能导致两个指针拥有 - 并尝试删除 - 同一个对象,这是非常糟糕的。您需要阻止复制(通过删除这些函数,或者(2011年之前)将它们声明为私有而不实现),或者实现某种安全复制语义。