智能指针数组
smart pointer array
我创建了一个智能指针类,如:
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) 将新的智能指针插入智能指针数组,以使数组调整大小并获得新对象的所有权
2) 在运行中删除一个智能指针,资源就会被释放,
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;
};
提前感谢!
您不能将Owner
或std::auto_ptr
(由于已弃用,因此无论如何都不应该使用)存储在标准容器中,因为它们实际上不可复制。
在C++11中,有std::unique_ptr
:一个取代auto_ptr
的单一所有权智能指针,它是可移动的,但不可复制。只要你不需要做任何涉及复制的事情,它就可以移动或放置到任何容器中。如果你需要多个指针来共享同一对象的所有权,那么你可以使用std::shared_ptr
。
如果由于某种原因,您一直使用较旧的语言版本,那么Boost可以为您提供智能指针,包括与标准版本非常相似的shared_ptr
,或与OwnerArray
类似的指针容器。
如果您决定推出自己的资源管理类,请始终记住"三条规则"。您显示的类隐式生成了复制构造函数和复制赋值运算符,这可能会导致两个指针拥有并试图删除同一个对象,这是非常糟糕的。您需要防止复制(通过删除这些函数,或者(2011年之前)在没有实现的情况下声明它们是私有的),或者实现某种安全的复制语义。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”