Различия при использовании shared_ptr и unique_ptr для указания на массив? - PullRequest
0 голосов
/ 01 сентября 2018

В C ++ 11 я только что обнаружил, что, похоже, существуют различия между shared_ptr и unique_ptr, когда они используются для выделения массива. Я хотел бы получить подтверждение, если то, что я нашел, является правильным.

Я должен использовать <int []> для unique_ptr, но <int> только для shared_ptr:

unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]);

shared_ptr<int> mySharedPtr = shared_ptr<int>( new int[100]);

Для unique_ptr мне не нужно перегружать delete functor / lambda func для указателя на массив:

unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]); //should be good enough

но я буду за shared_ptr:

shared_ptr< int> mySharedPtr = shared_ptr<int> ( new int [100], [](const int* p){delete [] p;});

Чтобы получить доступ к элементу в массиве через интеллектуальный указатель, с помощью unique_ptr я могу использовать обычный способ [index], но с shared_ptr я не могу сделать это:

myUniquePtr[10] = 100; // should be OK

но мне нужно

mySharedPtr.get()[10] = 100;

Не могли бы вы подтвердить правильность приведенных выше утверждений? Будет ли по-другому в C ++ 14?

1 Ответ

0 голосов
/ 01 сентября 2018

Различное поведение может быть объяснено тем фактом, что существует специализация template <class T, class Deleter> class unique_ptr<T[], Deleter> для std::unique_ptr. Эта специализация допускает различное поведение при использовании типа массива, а не скалярного типа.

Если вы посмотрите на https://en.cppreference.com/w/cpp/memory/unique_ptr,, вы также увидите, что только вариант массива реализует operator [], что позволяет вам осуществлять доступ, описанный в 3.

Если вы возьмете документацию по https://de.cppreference.com/w/cpp/memory/shared_ptr,, вы увидите, что для T[] в случае std::shared_ptr нет специальной обработки. Следовательно, вам нужно получить необработанный указатель, прежде чем вы сможете использовать «стандартный» доступ к массиву. Кроме того, он не может решить, когда использовать delete, а когда delete[], поэтому вам необходимо предоставить средство удаления, если вы не передаете объект, который может быть удален стандартным средством удаления.

Афаик, в C ++ нет изменений в этом поведении. 14.

...