Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Benefits of using BOOST shared_array over shared_ptr

I want to use BOOST Smart pointer for memory management in my application. But I'm not sure which smart pointer should I use for dynamically allocated array shared_ptr or shared_array.

According to the BOOST doc Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamically allocated array.

So I'm just wondering now what purpose user should use shared_array instead of shared_ptr.

like image 573
Hemant Gangwar Avatar asked Sep 22 '14 07:09

Hemant Gangwar


1 Answers

Before boost 1.53, boost::shared_ptr is to be used for a pointer to a single object.

After 1.53, since boost::shared_ptr can be used for array types, I think it's pretty much the same as boost::shared_array.

But for now I don't think it's a good idea to use array type in shared_ptr, because C++11's std::shared_ptr has a bit different behavior on array type compared to boost::shared_ptr.

See shared_ptr to an array : should it be used? as reference for the difference.

So if you want your code compatible with C++11 and use std::shared_ptr instead, you need to use it carefully. Because:

  • Code look like below gets compile error (you need a custom deleter), while boost's version is OK.

     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
    
  • However, if you write code like below, you are likely to get segment fault

     std::shared_ptr<T> a(new T[5]); // segment fault
     boost::shared_ptr<T> b(new T[5]); // segment fault
    

The syntax of shared_ptr in std and boost are different and not compatible.

Additional information: consider boost::ptr_vector, which is a pretty fast implementation for dynamic allocated objects in vector. Just FYI in case you want this feature.

like image 127
Mine Avatar answered Oct 13 '22 03:10

Mine