2013-07-26 10 views
9

Sembra che l'allocatore faccia lo stesso lavoro di "posizionamento nuovo" e "operatore nuovo". e la sua interfaccia è più conveniente.Abbiamo ancora bisogno di "posizionamento nuovo" e "operatore nuovo"?

Ad esempio:

string *ps = static_cast<string *>(operator new(sizeof(string))); 
new (ps) string("Hello"); 
cout<<*ps<<endl; 

può essere riscritta per

allocator<string> as; 
string *ps2 = as.allocate(1); 
as.construct(ps2,"Hello"); 
cout<<*ps2<<endl; 

Quindi questo significa che "nuova collocazione" e "operatore new" sono obsoleti?

+0

Per retrocompatibilità. –

+2

In particolare, 'allocator' richiede sia' placement new' che 'operator new' per fare ciò che fa. Direi che non sono "obsoleti", ma piuttosto non dovrebbero essere usati nel codice client. –

+0

Il nuovo posizionamento è effettivamente utilizzabile, in particolare negli ambienti indipendenti, come i sistemi integrati e le sonde. – Skeen

risposta

5

Sono ancora necessari. In quale altro modo implementeresti il ​​tuo allocatore personalizzato? ;)

Edit:

Questa risposta merita più spiegazioni:

Se si dà un'occhiata alla funzione di membro del construct std :: di allocatore si può vedere che utilizza il posizionamento nuovo operatore.

Quindi, la responsabilità di un allocatore è di allocare memoria non inizializzata abbastanza grande per l'oggetto tramite la funzione membro allocate, e quindi "in-place" costruirla in questo archivio tramite il suo membro construct. Quest'ultimo viene eseguito utilizzando il posizionamento nuovo.

Problemi correlati