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

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

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


person Perculator    schedule 09.03.2009    source источник


Ответы (2)


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

Однако вы можете предоставить свой собственный объект удаления для выполнения «удалить []», если хотите использовать этот конструктор:

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>());
person Brian Neal    schedule 09.03.2009
comment
На первый взгляд это выглядит хорошо, но предоставляет ли shared_ptr оператор []? Я не думаю, что буст делает. - person Evan Teran; 10.03.2009
comment
TR1 shared_ptr — нет. Вы всегда можете использовать int* p = sp.get(); р[5] = 42; Вы уверены, что вам нужен shared_array? Часто бывает достаточно вектора или строки. - person Brian Neal; 10.03.2009
comment
но если sp объявлен как shared_ptr<int>, то вы получите () не int *, а int? - person Yola; 21.12.2011
comment
@Yola - я не уверен, что понимаю ваш вопрос. sp.get() возвращает базовый необработанный указатель, которым управляет sp. - person Brian Neal; 21.12.2011
comment
@ Брайан Нил, извини, я перепутал get() с разыменованием - *sp. +1 - person Yola; 21.12.2011

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

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

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

person David Thornley    schedule 09.03.2009
comment
Но даже boost::shared_ptr‹› может быть создан с помощью пользовательского удаления, которое может выполнить удаление []. Я считаю, что именно поэтому TR1 не принял boost::shared_array. - person Brian Neal; 09.03.2009
comment
ну, C++1x также не принял shared_array. я не знаю почему. однако у них есть unique_ptr‹T›. если вы используете unique_ptr‹T[]›, то он использует delete[] для освобождения. я не знаю, почему они не предоставляют их и для shared_ptr. например, shared_ptr‹int[]› . - person Johannes Schaub - litb; 10.03.2009