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