2015-05-11 20 views

Antwort

26

Nehmen wir an, Sie haben etwas Speicher auf dem Heap über malloc zugewiesen und haben einen Zeiger T* p zu ihm. Sie haben am Ende nicht initialisierten Speicher, weil alle malloc macht einen Speicherort der Größe, die Sie als zugewiesen (new auf der anderen Seite tatsächlich Objekte erstellt und damit die zugewiesene Region initialisierten Speicher macht markiert). Da die Lage von p nicht starten Speicher kein gültiges Objekt vom Typ T dort sitzen haben, können Sie diese nicht

T a; 
*p = a; 

da kein Objekt vom Typ ist T bei p auf den Zuweisungsoperator aufzurufen. Stattdessen haben Sie ein Konstrukt, ein Objekt vom Typ T am Ort p mit placement new:

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

std::uninitialized_copy einfach implementiert die Palette Version des obigen Code-Schnipsel, wenn sie mit einem Bereich zu tun, die Sie nicht initialisierten Speicher kopieren Sie wollen .

+1

Ihre Antwort nagelt es, gelöscht meins, +1. – vsoftco

+0

Ist 'uninitialized_copy' genau gleichbedeutend mit' memcpy'? –

+1

@MattMcNabb Das wäre nur wahr, wenn sie trivial kopierbar sind, AFAIK. – Pradhan

Verwandte Themen