Il ridimensionamento in C++ è scomodo a causa della potenziale necessità di chiamare costruttori e distruttori.
Non credo che ci sia una ragione fondamentale per cui in C++ non si poteva avere un operatore di resize[]
di andare con new[]
e delete[]
, che ha fatto qualcosa di simile a questo:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Ovviamente oldsize
verrebbero recuperati da una posizione segreta, lo stesso è in delete[]
e Type
verrebbe dal tipo dell'operando. resize[]
non riuscirebbe dove il Tipo non è copiabile, il che è corretto, dal momento che tali oggetti semplicemente non possono essere trasferiti. Infine, il codice sopra predefinito costruisce gli oggetti prima di assegnarli, cosa che non si vorrebbe come comportamento effettivo.
C'è una possibile ottimizzazione in cui newsize <= oldsize
, per chiamare i distruttori per gli oggetti "oltre la fine" del nuovo array ensmallened e non fare nient'altro.Lo standard dovrebbe definire se questa ottimizzazione è richiesta (come quando si è resize()
un vettore), consentita ma non specificata, consentita ma dipendente dall'implementazione o proibita.
La domanda che dovresti poi porsi è, "è effettivamente utile fornire questo, dato che lo fa anche vector
, ed è progettato specificamente per fornire un contenitore resize-resable (di memoria contigua - quel requisito omesso in C++ 98 ma risolto in C++ 03) che è un adattamento migliore degli array con i modi C++ di fare le cose? "
Penso che la risposta sia ampiamente considerata "no". Se si desidera eseguire buffer ridimensionabili in modalità C, utilizzare malloc/free/realloc
, disponibili in C++. Se si desidera eseguire buffer ridimensionabili in modo C++, utilizzare un vettore (o deque
, se non si ha effettivamente bisogno di spazio di archiviazione contiguo). Non provare a mescolare i due utilizzando new[]
per i buffer raw, a meno che non si stia implementando un contenitore di tipo vettoriale.
Stroustrup ha risposto a questo molto tempo fa, vedere: http://www2.research.att.com/~bs/bs_faq2.html#renew (Questo è un buon inizio se siete nuovi al C++ insieme alle FAQ di C++ di Cline.) – dirkgently
La risposta a cui fa riferimento @dirkgently è ora disponibile all'indirizzo: http://www.stroustrup.com/bs_faq2.html#renew e le domande frequenti di Cline fanno ora parte delle super FAQ: https://isocpp.org/faq – maxschlepzig