Преимущества использования BOOST shared_array по сравнению с shared_ptr

Я хочу использовать BOOST Smart pointer для управления памятью в моем приложении. Но я не уверен, какой умный указатель следует использовать для динамически выделяемого массива shared_ptr или shared_array.

Согласно BOOST doc Начиная с версии 1.53 Boost, shared_ptr может использоваться для хранения указателя на динамически выделяемый массив.

Поэтому мне просто интересно, с какой целью пользователь должен использовать shared_array вместо shared_ptr.


person Hemant Gangwar    schedule 22.09.2014    source источник
comment
Почему не std::vector для динамических массивов и std::unique_ptr для объектов?   -  person Maxim Egorushkin    schedule 22.09.2014
comment
У меня есть сторонние библиотечные функции, которые принимают необработанный указатель в качестве аргумента, поэтому я не могу использовать вектор.   -  person Hemant Gangwar    schedule 22.09.2014
comment
std::vector имеет тот же непрерывный макет, что и простой массив. std::vector::data() и &vec[0] позволяют извлечь указатель на этот массив.   -  person Maxim Egorushkin    schedule 22.09.2014
comment
Верно, но просто любопытно, есть ли недостатки в использовании vector вместо share_ptr.   -  person Hemant Gangwar    schedule 22.09.2014
comment
Напротив, shared_ptr следует использовать только в крайнем случае.   -  person Maxim Egorushkin    schedule 22.09.2014


Ответы (1)


До повышения 1.53, boost::shared_ptr должен использоваться для указателя на один объект.

После 1.53, поскольку boost::shared_ptr можно использовать для типов массивов, я думаю, что это почти то же самое, что и boost::shared_array.

Но пока я не думаю, что использовать тип массива в shared_ptr - хорошая идея, потому что std::shared_ptr в C ++ 11 имеет немного другое поведение для типа массива по сравнению с boost::shared_ptr.

См. shared_ptr для массива: следует ли его использовать? как ссылка на разницу.

Поэтому, если вы хотите, чтобы ваш код был совместим с 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_ptr в std и boost различен и несовместим.

Дополнительная информация: рассмотрите возможность boost :: ptr_vector , который является довольно быстрой реализацией для динамически размещаемых объектов в векторе. Просто к сведению, если вам нужна эта функция.

person Mine    schedule 22.09.2014
comment
спасибо, я согласен с тем, чтобы сделать его совместимым с C + 11, я должен использовать либо настраиваемую опцию deleter, либо boost shared_array, но я ищу любые дополнительные преимущества, которые я получу после использования shared_array вместо shared_ptr. - person Hemant Gangwar; 22.09.2014
comment
Я не знаю, существуют ли дополнительные преимущества для shared_array. А в будущем C ++ может представить shared_ptr<T[]>, тогда он будет совместим с boost. Но, прежде всего, лучше подумать, действительно ли вам нужен shared_array, может быть, массив scoped достаточно, чтобы удовлетворить потребность, или вместо этого вы можете использовать std::unique_ptr<T[]>. - person Mine; 22.09.2014