智能指针数组

smart pointer array

本文关键字:数组 指针 智能      更新时间:2023-10-16

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

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) 将新的智能指针插入智能指针数组,以使数组调整大小并获得新对象的所有权

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

提前感谢!

您不能将Ownerstd::auto_ptr(由于已弃用,因此无论如何都不应该使用)存储在标准容器中,因为它们实际上不可复制。

在C++11中,有std::unique_ptr:一个取代auto_ptr的单一所有权智能指针,它是可移动的,但不可复制。只要你不需要做任何涉及复制的事情,它就可以移动或放置到任何容器中。如果你需要多个指针来共享同一对象的所有权,那么你可以使用std::shared_ptr

如果由于某种原因,您一直使用较旧的语言版本,那么Boost可以为您提供智能指针,包括与标准版本非常相似的shared_ptr,或与OwnerArray类似的指针容器。

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