Перед форсированием 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, если вы хотите эту функцию.
Почему бы не 'std :: vector' для динамических массивов и' std :: unique_ptr' для объектов? –
У меня есть функции сторонней библиотеки, которые берут raw указатель в качестве аргумента, поэтому я не могу использовать вектор. –
'std :: vector' имеет тот же смежный макет, что и простой массив. 'std :: vector :: data()' и '& vec [0]' позволяют извлекать указатель на этот массив. –