在shared_ptr上使用BOOST shared_array的好处
Benefits of using BOOST shared_array over shared_ptr
我想在应用程序中使用BOOST智能指针进行内存管理。但我不确定应该为动态分配的数组shared_ptr
或shared_array
使用哪个智能指针。
根据BOOST
文档从Boost 1.53版本开始,shared_ptr可以用于保存指向动态分配数组的指针
所以我现在只是想知道用户应该使用shared_array而不是shared_ptr来达到什么目的。
在boost 1.53之前,boost::shared_ptr
将用于指向单个对象的指针。
1.53之后,由于boost::shared_ptr
可以用于数组类型,我认为它与boost::shared_array
基本相同。
但就目前而言,我认为在shared_ptr
中使用数组类型不是一个好主意,因为与boost::shared_ptr
相比,C++11的std::shared_ptr
在数组类型上有点不同。
请参阅数组的shared_ptr:是否应该使用它?作为差异的参考。
因此,如果您希望您的代码与C++11兼容,并使用std::shared_ptr
,则需要小心使用它。因为:
-
下面的代码出现编译错误(您需要一个自定义的deleter),而boost的版本还可以
std::shared_ptr<int[]> a(new int[5]); // Compile error // You need to write like below: std::shared_ptr<int> b(new int[5], std::default_delete<int[]>()); boost::shared_ptr<int[]> c(new int[5]); // OK
-
然而,如果你写下面这样的代码,你很可能会得到段故障
std::shared_ptr<T> a(new T[5]); // segment fault boost::shared_ptr<T> b(new T[5]); // segment fault
std
和boost
中shared_ptr
的语法不同且不兼容。
附加信息:考虑boost::ptr_vector,它是vector中动态分配对象的一个非常快速的实现。仅供参考,以防您想要此功能。
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 我可以安全地复制矢量<array>吗?
- 引用 std::shared:ptr 以避免引用计数
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据
- 是否可以使用 std::array 作为 POD 结构的数据容器?