C++ 智能指针阵列

C++ 智能指针阵列,c++,pointers,ownership,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. }; 提

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

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

提前谢谢

您不能将您的
所有者
std::auto_ptr
(您无论如何都不应该使用它,因为它已被弃用)存储在标准容器中,因为它们实际上不可复制

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

如果您因某种原因无法使用较旧的语言版本,那么Boost可以为您提供一个与标准版本非常相似的
共享\u ptr
,或者与您的
OwnerArray
类似的版本


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

为什么不使用已经存在的智能指针?请参见,例如和。
auto_ptr
在标准库中,而不是boost中。您需要
shared_ptr
(或者
unique_ptr
,如果您可以使用C++11。)您需要复制运算符和复制赋值运算符()。您必须制定适当的所有权转移策略。除了学习之外,没有理由重新发明轮子。除非“其他成员”包括一个拷贝执行器和一个拷贝分配操作符,否则你违反了三个规则。我完全同意约阿希姆、肯尼和雷姆斯的观点。您的智能指针与“唯一”或“共享”指针有何不同?谢谢您的评论!是的,我当然可以使用auto_ptr或其他标准智能指针,我这里的问题是关于是否存在智能指针数组工具?非常感谢,我认为指针容器可能是我感兴趣的。
 class Adapter;

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

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