Puntatori e contenitori
-
02-07-2019 - |
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> >
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 :)