在shared_ptr上使用BOOST shared_array的好处

时间:2014-09-22 07:36:49

标签: c++ boost smart-pointers

我想在我的应用程序中使用 BOOST智能指针进行内存管理。但是我不确定应该将哪个智能指针用于动态分配的数组shared_ptrshared_array

根据BOOST doc 从Boost版本1.53开始,shared_ptr可用于保存指向动态分配数组的指针。

所以我现在想知道用户应该使用 shared_array 而不是 shared_ptr 的目的。

1 个答案:

答案 0 :(得分:6)

在boost 1.53之前,shared_ptr将用于指向单个对象的指针。

1.53之后,由于shared_ptr可以用于数组类型,我认为它与shared_array几乎相同。

但是现在我认为在shared_ptr中使用数组类型是个好主意,因为C ++ 11的std::shared_ptr行为有点不同数组类型与boost::shared_ptr相比。

请参阅shared_ptr to an array : should it be used?作为差异的参考。

因此,如果您希望代码与C ++ 11兼容并使用std::shared_ptr代替,则需要仔细使用它。这是因为:

  • 代码看起来像下面的编译错误(你需要一个自定义删除器),而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
    

shared_ptrstdboost的语法不同且不兼容。

附加信息:考虑boost::ptr_vector,这是向量中动态分配对象的一种非常快速的实现。仅供参考,以防您需要此功能。