Совместно используемые массивы TR1 - PullRequest
15 голосов
/ 09 марта 2009

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

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

Ответы [ 2 ]

23 голосов
/ 09 марта 2009

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

Однако вы можете предоставить свой собственный объект для удаления, чтобы выполнить «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>());
1 голос
/ 09 марта 2009

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

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

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

...