Per quanto riguarda la progettazione, utilizzare l'allocazione automatica (stack) il più possibile. Ogni volta che è necessario estendere la durata di un oggetto oltre un determinato ambito, allocarlo dinamicamente.
E anche così, mai allocare dinamicamente le cose prime. Mantenerli sempre avvolti in una sorta di wrapper che implementa Scope-Bound Resource Management (SBRM, noto inizialmente con il nome stupido/imbarazzante Acquisizione risorse è inizializzazione o RAII.) Cioè, le allocazioni dinamiche dovrebbero essere mantenute in oggetti automatici che puliranno su automaticamente!
Un buon esempio di questo è std::vector
: non si può perdere la memoria interna a vector
, perché è distruttore viene eseguito in ogni scenario quando la memoria deve essere liberata, e lo libererà per voi. auto_ptr
è il primo e unico puntatore intelligente disponibile nella libreria standard, ma è piuttosto brutto. È meglio usare shared_ptr
o molti altri popolari puntatori intelligenti disponibili in Boost e/o TR1 e/o C++ 0x.
performance, oggetti allocati in pila può essere fatto in modo molto rapidamente (la dimensione dello stack viene aumentata per-funzione-chiamata, in modo tutta la memoria richiesta è stato allocato up-front da un semplice movimento di una pointer.) Contrariamente, l'allocazione dinamica richiede generalmente molto più tempo. È abbastanza possibile ottenere allocazioni dinamiche veloci con schemi di allocazione personalizzati, ma anche i migliori saranno ancora più lenti dell'allocazione dello stack.
Occasionalmente, potresti scoprire che passi troppo tempo a copiare gli oggetti. In questo caso, potrebbe valerne la pena allocarlo dinamicamente e spostare semplicemente i puntatori. Tuttavia, si prega di notare che ho detto "trova". Questo tipo di cambiamento è qualcosa che trovi profilando e misurando, mai indovinando.
Quindi: allocazione automatica quando possibile, allocazione dinamica quando necessario.
Sì. Il mio consiglio è di leggere questo libro: http://www2.research.att.com/~bs/3rd.html in particolare capitolo 5: Puntatori, matrici e strutture –
Capisci in primo luogo perché potrebbe essere necessario creare oggetti dinamicamente? –