Общие массивы TR1

Мне было трудно найти ссылки в документации TR1, касающейся общих массивов. Документация Boost достаточно ясна, что существует значительная разница между выражениями С++ "new" и "new []". Шаблон shared_ptr предназначен для правильного удержания указателя на динамически выделенное объектное созданное с использованием "нового". Шаблон shared_array предназначен для правильного удержания указателя на динамически выделенный массив с использованием "new []".

Я пытаюсь обновить некоторый код, чтобы использовать шаблон TR1 shared_ptr и связанные с ним функции, но я не нашел упоминания о shared_array. Выполняет ли реализация TR1 shared_ptr "новый" и "новый []" и правильно ли уничтожает эти указатели? Насколько я могу судить по просмотру спецификации TR1, похоже, что нет. Если это так, должен ли я использовать шаблон boost_array boost для "новых []" атрибутов стиля?

Ответы

Ответ 1

Это правильно, в TR1 нет shared_array.

Однако вы можете предоставить вашему собственному объекту deleter выполнение "delete []", если вы хотите использовать этот конструктор:

template<class Other, class D>
   shared_ptr(Other* ptr, D dtor);

Например:

template<typename T>
struct my_array_deleter
{
   void operator()(T* p)
   {
      delete [] p;
   }
};

shared_ptr<int> sp(new int[100], my_array_deleter<int>());

Ответ 2

Я подозреваю, что большинство людей, которые используют TR1, не используют массивы, но вместо этого используют vector < > .

Я не читал TR1, поэтому я отвечу на основе Boost, что, вероятно, достаточно хорошо. boost:: shared_ptr < > имеет дело с отдельными объектами, а не с массивами. Это то, что boost:: shared_array < > для.

Если вы используете массивы и имеете причины конвертировать в shared_array < > но не в вектор < > , используйте shared_array < > .