首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能指针数组

智能指针数组
EN

Stack Overflow用户
提问于 2012-09-13 18:20:43
回答 1查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
 class Adapter;

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

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-13 19:03:22

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

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

如果你因为某些原因而坚持使用老版本的语言,那么Boost可以为你提供smart pointers,包括一个非常类似于标准版本的shared_ptr,或者类似于你的OwnerArraypointer containers

如果您确实决定使用自己的资源管理类,请始终记住Rule of Three。您展示的类具有隐式生成的复制构造函数和复制赋值操作符,这可能导致两个指针拥有-并试图删除-相同的对象,这是非常糟糕的。你需要防止复制(通过删除这些函数,或者(2011年之前)声明它们是私有的而没有实现),或者实现某种安全的复制语义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12404095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档