2014-09-22 2 views
4

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

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

Так что я просто интересно, что теперь пользователь должен использовать цель shared_array вместо shared_ptr.

+0

Почему бы не 'std :: vector' для динамических массивов и' std :: unique_ptr' для объектов? –

+0

У меня есть функции сторонней библиотеки, которые берут raw указатель в качестве аргумента, поэтому я не могу использовать вектор. –

+1

'std :: vector' имеет тот же смежный макет, что и простой массив. 'std :: vector :: data()' и '& vec [0]' позволяют извлекать указатель на этот массив. –

ответ

6

Перед форсированием 1.53, shared_ptr следует использовать для указателя на один объект.

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

Но сейчас я не думаю, что это хорошая идея, чтобы использовать тип массива в shared_ptr, потому что 11 C++ 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 
    
  • Однако, если вы пишете код, как показано ниже, вы, вероятно, получить FAULT сегмент

    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, что является довольно быстрой реализацией для динамических выделенных объектов в векторе. Просто FYI, если вы хотите эту функцию.

+0

спасибо, я согласен с тем, что для этого ** C + 11 ** совместимо. Я должен пойти либо с пользовательским ** deleter ** или ** boost shared_array **, но я ищу любые дополнительные преимущества, которые я получу после использования 'shared_array' над' shared_ptr'. –

+0

Я не знаю, существуют ли какие-либо дополнительные преимущества для 'shared_array'. И в будущем C++ * может * ввести 'shared_ptr ', тогда он будет совместим с boost.Но, прежде всего, лучше подумать, действительно ли вам нужно 'shared_array', возможно, массив * scoped * достаточно, чтобы соответствовать потребностям, вместо этого вы можете использовать' std :: unique_ptr '. – Mine

Смежные вопросы