2011-01-29 12 views
6

Dopo aver letto timdays answer-this question io sono curioso di sapere la differenza tra boost::ptr_container e std::vector<shared_ptr>. Avevo l'impressione che lo a boost::ptr_container had ownership over the pointers given to it, e al momento del rilascio, chiamasse i distruttori di tutti i suggerimenti che conteneva a prescindere da altri riferimenti ai suoi abitanti. Quale è contrario allo scopo di un std::vector<shared_ptr>, che dopo il rilascio rilascerebbe solo i puntatori stessi se il numero di riferimento era 0?boost :: ptr_container e std :: vector <shared_ptr>

Se questo è il caso (suppongo che non lo è), perché avrebbero anche l'esempio di documentazione Boost compare the two come se essi sono simili nello scopo, e perché avrebbero timday di rispondere a proporre un boost::ptr_container quando è molto diverso allo scopo di un std::vector<shared_ptr>.

risposta

7

Hai ragione, i due sono molto diversi.

La prima differenza, come hai notato, è la semantica della proprietà. La proprietà degli oggetti in un contenitore di puntatori NON è condivisa. A questo proposito, un boost::ptr_vector<T> è molto più vicino a un std::vector<std::unique_ptr<T>>.

Ma questa non è l'unica differenza!

  • se non esplicitamente indicato nel tipo, un puntatore contenitore non conterrà puntatore nullo
  • un puntatore contenitore ha semantica della copia profonde (utilizzando il metodo new_clone), e possono essere copiati solo se l'oggetto tenuto è copiabile
  • un contenitore di puntatori ha una semantica di deep const, ovvero se il contenitore è const quindi non è possibile modificare uno dei suoi elementi.

Per quanto riguarda il motivo per cui @timday sentito in dovere di parlare Boost Pointer Container, penso che sia perché voleva ampliare la domanda un po '. I contenitori di puntatore boost sono molto simili agli puntatori intelligenti che possono contenere più oggetti e forniscono una sintassi migliore dei contenitori di puntatori in generale.

quanto riguarda il suo confronto ad un std::vector< boost::shared_ptr<T> > Credo sia semplicemente perché questo è il modo tradizionale di attuare un vettore di puntatori in assenza di movimento semantica (senza unique_ptr) poiché auto_ptr non può essere utilizzato in un contenitore STL. La gente semplicemente non sa di Pointer Containers il più delle volte ...

1

Ci sono situazioni in cui entrambi possono essere applicati: ad esempio un gruppo di funzioni agisce come client del contenitore, portando puntatori a oggetti polimorfici e facendo operazioni su di essi. Se il contenitore sopravvive a tutte le funzioni, può essere sostituito da un contenitore di puntatori.

Timer ha risposto alla domanda "Qual è la differenza tra il seguente insieme di puntatori" sottolineando un'omissione nell'elenco.