Есть ли в C ++ 11 оболочки для динамически размещаемых массивов, таких как Boost's scoped_array? - PullRequest
27 голосов
/ 24 декабря 2011

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

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

Ответы [ 2 ]

48 голосов
/ 24 декабря 2011

Существует специализация 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[]> для удаления, поскольку у него нет такого, как shared_ptr<t[]>.

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());
0 голосов
/ 10 февраля 2015

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

...