2015-05-11 17 views

Odpowiedz

26

Powiedzmy, że przydzieliliśmy trochę pamięci na stercie za pomocą malloc i mamy do niej wskaźnik T* p. Kończy się to niezainicjowanym przechowywaniem, ponieważ wszystkie wartości malloc oznaczają lokalizację o żądanym rozmiarze (new z drugiej strony faktycznie tworzy obiekty, a tym samym inicjuje przydzielony region pamięci masowej). Ponieważ lokalizacja pamięci począwszy od p nie posiada ważnego obiektu typu T siedzi tam, nie można zrobić tego

T a; 
*p = a; 

ponieważ nie ma żadnego obiektu typu T na p powołać się na operatora przypisania. Zamiast tego trzeba będzie skonstruować obiekt typu T w miejscu p użyciu placement new:

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

std::uninitialized_copy prostu implementuje wersję zakres powyższego fragmentu kodu gdy ma do czynienia z zakresu, który chcesz skopiować do niezainicjowanej pamięci .

+1

Twoja odpowiedź nails to, usunięte moje, +1. – vsoftco

+0

Czy 'uninitialized_copy' jest dokładnie równoważne' memcpy'? –

+1

@MattMcNabb To byłoby prawdą tylko wtedy, gdy są one trywialnie kopiowane, AFAIK. – Pradhan

Powiązane problemy