2012-09-13 129 views
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_ptr升压库),但现在我有,我想存储的动态数组的要求在一个OBJ智能指针,并且它必须支持:

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

2)删除一个智能指针即时和资源获得fre编辑,

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

在此先感谢!

+3

为什么不使用已存在的智能指针?见例如['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)和['std :: unique_ptr'](http://en.cppreference.com/w/cpp /存储器/的unique_ptr)。 –

+1

'auto_ptr'在标准库中,而不是boost。你需要'shared_ptr'(或'unique_ptr',如果你可以使用C++ 11的话)。 – kennytm

+2

你需要复制运算符和复制赋值运算符([three规则](http://en.wikipedia.org/wiki/Rule_of_three_ (C%2B%2B_programming)))。你必须弄清楚适当的所有权转让政策。除了学习,没有理由重新发明车轮。 –

回答

0

你无法保存您的Owner,或std::auto_ptr(你不应该反正用的,因为它是不建议使用),在标准的容器,因为他们是不是真的能够复制。

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

如果你坚持使用旧的语言版本出于某种原因,然后加速可以给你smart pointers,包括shared_ptr非常相似的标准之一,或pointer containers类似于您OwnerArray

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

+0

非常感谢,我认为指针容器可能是我的兴趣所在。 –