Имеет ли С++ 11 оболочки для динамически распределенных массивов, таких как Boost scoped_array?

Мне часто приходится иметь дело с динамически распределенными массивами на С++ и, следовательно, полагаться на Boost для scoped_array, shared_array и т.п. После прочтения Stroustrup С++ 11 FAQ и С++ 11 Reference Wiki, я не смог найти подходящую замену для этих динамических массивных оболочек, которые предоставляются стандартом С++ 11. Есть ли что-то, что я упустил, или мне нужно продолжать полагаться на Boost?

Большое спасибо за вашу помощь!

Ответ 1

Существует специализация unique_ptr, например unique_ptr<T[]>.

#include <iostream>
#include <memory>

struct test
{
  ~test() { std::cout << "test::dtor" << std::endl; }
};

int main()
{
  std::unique_ptr<test[]> array(new test[3]);
}

Когда вы запустите его, вы получите это сообщение.

test::dtor
test::dtor
test::dtor

Если вы хотите использовать shared_ptr, вы должны использовать std::default_delete<T[]> для deleter, так как у него нет одного типа shared_ptr<t[]>.

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());

Ответ 2

Насколько векторы предназначены в качестве оберток массивов, что делать, если вы используете любой подходящий смарт-указатель с вектором в качестве внутреннего объекта?