0

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

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_ptrin boost 库),但现在我需要将智能指针的动态数组存储在 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;
 };

提前致谢!

4

1 回答 1

0

您不能将您的Owner, or std::auto_ptr(无论如何都不应该使用,因为它已被弃用)存储在标准容器中,因为它们不是真正可复制的。

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

如果由于某种原因你被旧语言版本卡住了,那么 Boost 可以为你提供智能指针,包括一个shared_ptr非常类似于标准的指针容器,或者类似于你的OwnerArray.

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

于 2012-09-13T11:03:21.830 回答