Domanda

Sappiamo tutti che i puntatori RAW devono essere racchiusi in qualche forma di puntatore intelligente per ottenere una gestione della memoria sicura delle eccezioni. Ma quando si tratta di contenitori di puntatori il problema diventa più spinoso.

I contenitori std insistono sul fatto che l'oggetto contenuto sia copiabile, quindi questo esclude l'uso di std :: auto_ptr, sebbene sia ancora possibile usare boost :: shared_ptr ecc.

Ma ci sono anche alcuni contenitori boost progettati esplicitamente per contenere i puntatori in modo sicuro:
Vedi Libreria contenitore puntatori

La domanda è: In quali condizioni dovrei preferire utilizzare ptr_containers su un contenitore di smart_pointers?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
È stato utile?

Soluzione

I contenitori puntatore boost hanno una rigida proprietà sulle risorse che detengono. A std :: vector & Lt; boost :: shared_ptr & Lt; X & Gt; & Gt; ha una proprietà condivisa. Ci sono ragioni per cui potrebbe essere necessario, ma in caso contrario, per impostazione predefinita potrei aumentare :: ptr_vector & Lt; X & Gt ;. YMMV.

Altri suggerimenti

Acceso: i puntatori intelligenti sono un ottimo metodo per gestire la gestione delle risorse, ma non l'unico. Sono d'accordo che vedrai pochissimi puntatori grezzi nel codice C ++ ben scritto, ma nella mia esperienza non vedi nemmeno molti puntatori intelligenti. Esistono molte classi perfettamente sicure per le eccezioni implementate usando contenitori di puntatori non elaborati.

Bene, l'overhead è un caso.

Un vettore di puntatori condivisi eseguirà molte copie estranee che implicano la creazione di un nuovo puntatore intelligente, l'incremento di un riferimento, il decremento di un riferimento, ecc. su un ridimensionamento. Tutto ciò viene evitato con un contenitore puntatore.

Richiede la profilazione per garantire che le operazioni del contenitore siano il collo di bottiglia :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top