2015-05-11 17 views

Trả lời

26

Cho phép nói rằng bạn đã cấp phát một số bộ nhớ trên heap qua malloc và có con trỏ T* p cho nó. Bạn kết thúc với lưu trữ uninitialized vì tất cả các malloc không đánh dấu một vị trí kích thước bạn yêu cầu như được phân bổ (new mặt khác thực sự xây dựng các đối tượng và do đó làm cho vùng được cấp phát lưu trữ). Kể từ khi vị trí bộ nhớ bắt đầu từ p không có một đối tượng hợp lệ của loại T ngồi đó, bạn không thể làm được điều này

T a; 
*p = a; 

vì không có đối tượng của loại T tại p để gọi toán tử gán vào. Thay vào đó, bạn sẽ có một cấu trúc một đối tượng kiểu T tại địa điểm p sử dụng placement new:

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

std::uninitialized_copy chỉ đơn giản là thực hiện các phiên bản hàng loạt các đoạn mã trên khi giao dịch với một phạm vi mà bạn muốn sao chép để lưu trữ chưa được khởi tạo .

+1

Câu trả lời của bạn đánh dấu nó, đã xóa của tôi, +1. – vsoftco

+0

'Uninitialized_copy' có chính xác tương đương với' memcpy' có hiệu lực không? –

+1

@MattMcNabb Điều đó sẽ chỉ đúng nếu chúng có thể sao chép được, AFAIK. – Pradhan

Các vấn đề liên quan