2015-05-11 14 views

risposta

26

Supponiamo di aver allocato un po 'di memoria nello heap tramite malloc e di avere un puntatore T* p. Si finisce con l'archiviazione non inizializzata perché tutto il malloc fa contrassegnare una posizione della dimensione richiesta come allocata (new d'altra parte effettivamente costruisce oggetti e quindi rende la memoria inizializzata della regione allocata). Dal momento che la posizione di memoria a partire da p non ha un oggetto valido di tipo T seduto lì, non si può fare questo

T a; 
*p = a; 

poiché non v'è oggetto di tipo T a p per richiamare l'operatore di assegnamento su. Invece, si avrà un costrutto un oggetto di tipo T in posizione p utilizzando placement new:

T a; 
new (p) T{a}; 

std::uninitialized_copy implementa semplicemente la versione gamma del frammento di codice di cui sopra quando si tratta di una gamma che si desidera copiare nella memoria non inizializzata .

+1

La tua risposta lo inchioda, cancella il mio, +1. – vsoftco

+0

È 'uninitialized_copy' esattamente equivalente a' memcpy' in effetti? –

+1

@MattMcNabb Questo sarebbe vero solo se sono banalmente copiabili, AFAIK. – Pradhan

Problemi correlati