Общие массивы 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 < > .