我创建了一个智能指针类,如下所示:
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++的最佳实践建议不要在标准容器中存储智能指针,因为复制/赋值行为,那么我还能用什么其他东西来实现这一点呢?类似于下面示例中的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;
};提前感谢!
发布于 2012-09-13 19:03:22
您不能将您的Owner或std::auto_ptr (无论如何都不应该使用,因为它已被弃用)存储在标准容器中,因为它们实际上是不可复制的。
在C++11中,有std::unique_ptr:取代auto_ptr的单一所有权智能指针,它是可移动的,但不能复制。它可以移动或嵌入到任何容器中,只要您不需要执行任何涉及复制它的操作。如果您需要多个指针来共享同一对象的所有权,那么您可以使用std::shared_ptr。
如果你因为某些原因而坚持使用老版本的语言,那么Boost可以为你提供smart pointers,包括一个非常类似于标准版本的shared_ptr,或者类似于你的OwnerArray的pointer containers。
如果您确实决定使用自己的资源管理类,请始终记住Rule of Three。您展示的类具有隐式生成的复制构造函数和复制赋值操作符,这可能导致两个指针拥有-并试图删除-相同的对象,这是非常糟糕的。你需要防止复制(通过删除这些函数,或者(2011年之前)声明它们是私有的而没有实现),或者实现某种安全的复制语义。
https://stackoverflow.com/questions/12404095
复制相似问题