2015-09-22 11 views
7

Mi chiedevo perché gli array dinamici sono direttamente supportati da std::unique_ptr<> ma non da std::shared_ptr<>:Perché non esiste una specializzazione per std :: shared_ptr <T[]>?

unique_ptr<int[]> ptr1(new int[n]); /// OK! 
shared_ptr<int[]> ptr2(new int[n]); /// Incorrect: will not call delete[] 

Update: ho scoperto che la seconda linea può essere riscritto come:

shared_ptr<int> ptr2(new int[n], default_delete<int[]>()); 

Ora mi chiedo cosa sta succedendo dietro la scena che rende std::shared_ptr funziona con il secondo approccio e non nel modo simile a std::unique_ptr?

+0

Che messaggio di errore ricevi? –

+0

Non si tratta di un messaggio di errore, si tratta della correttezza della seconda riga poiché non richiama la cancellazione [] – Vahid

+0

Non devi specificare un deleter con 'unique_ptr ' (cioè il 'deleter' il parametro template non ha valore predefinito)? Questo almeno è ciò che è suggerito [qui] (http://en.cppreference.com/w/cpp/memory/unique_ptr) se non sbaglio. – Walter

risposta

3

Con shared_ptr è necessario utilizzare un deleter personalizzato che richiama delete[], se si alloca l'array con new[].

Inoltre, si deve fare attenzione con up e down-casting proprio come con i puntatori raw, in modo da non invocare il comportamento non definito.

unique_ptr ha il supporto diretto per gli array, in modo tale che quando sa che contiene un puntatore all'array non è possibile eseguire il down- o down-cast e il delet predefinito richiama delete[].

+3

Lo capisco, ma è dovuto a una limitazione di shared_ptr che non può utilizzare delete []? – Vahid

+1

@Vahid: 'shared_ptr' deriva dalla libreria Boost, che ha anche [' shared_array'] (http://www.boost.org/doc/libs/1_59_0/libs/smart_ptr/shared_array.htm). È discutibilmente una divisione più pulita delle specializzazioni di 'unique_ptr'. Ma significa che 'shared_ptr', in base alla progettazione, non supporta attivamente gli array. Devi inserirli in esso, ad es. utilizzando un deleter personalizzato. –

+0

Quindi, il motivo è dovuto alla compatibilità con la lib di Boost, e poiché 'shared_array' non è ancora stato portato su STL, giusto? – Vahid

Problemi correlati