Во-первых, все, что в boost::detail
- это деталь реализации.Не трогайте его, если вы не разрабатываете код, который будет частью самого Boost.
Во-вторых, boost::shared_ptr
не может напрямую оборачивать массивы.Это связано с тем, что массивы в C ++ должны быть удалены с помощью delete []
, а boost::shared_ptr
- с помощью delete
.Вместо этого используйте boost::shared_array
или, возможно, от boost::shared_ptr
до std::vector
.Если вам действительно нужно использовать shared_ptr
с массивом, вы должны создать его с помощью пользовательского удалителя:
template <typename T>
struct array_deleter {
void operator()(T *p) {
delete [] p;
}
};
// later...
boost::shared_ptr<int> p(new int[50], array_deleter<int>());
Однако на самом деле не делайте этого.Используйте shared_array<int>
или shared_ptr<vector<int> >
.
Что касается того, почему вы не можете просто сделать:
boost::shared_ptr<int> a;
// later
a = new int;
Это потому, что было бы опасно делать это слишком легко, чтобы сделатьчто-то shared_ptr - помните, если вы сделаете что-то shared_ptr дважды, вы в конечном итоге сделаете это дваждыТаким образом, shared_ptrs будет принимать только сырые указатели через их конструктор.Если вы действительно хотите перезаписать shared_ptr необработанным указателем, вот один из способов:
a.swap(boost::shared_ptr<int>(new int));
Это создает новый указатель, а затем заменяет его на a
.Временный умный указатель (со старым значением a
) затем освобождается.