Trong C thực tế ++ chuẩn, tạo ra bộ sưu tập thỏa mãn quy tắc sau đây là khó khăn nếu không muốn nói là không thể:unique_ptr - cải tiến chính?
- ngoại lệ an toàn,
- hoạt động giá rẻ nội bộ (trong STL container thực tế: các hoạt động là bản sao),
- tự động quản lý bộ nhớ.
Để đáp ứng (1), bộ sưu tập không thể lưu trữ con trỏ thô. Để thỏa mãn (2), một bộ sưu tập phải lưu trữ các con trỏ thô. Để thỏa mãn (3), một tập hợp phải lưu trữ các đối tượng theo giá trị.
Kết luận: ba mục xung đột với nhau.
Mục (2) sẽ không được thỏa mãn khi shared_ptr
được sử dụng vì khi bộ sưu tập cần di chuyển một phần tử, nó sẽ cần thực hiện hai cuộc gọi: tới một hàm tạo và hủy. Không có hoạt động lớn, memcpy()
giống như sao chép/di chuyển là có thể.
Tôi có đúng là vấn đề được mô tả sẽ được giải quyết bởi unique_ptr
và std::move()
? Bộ sưu tập sử dụng các công cụ này sẽ có thể đáp ứng tất cả 3 điều kiện:
- Khi một bộ sưu tập sẽ bị xóa như một tác dụng phụ của một ngoại lệ, nó sẽ gọi hàm hủy
unique_ptr
's. Không bị rò rỉ bộ nhớ. -
unique_ptr
không cần thêm dung lượng cho bộ đếm tham chiếu; do đó cơ thể của nó nên được chính xác kích thước tương tự như con trỏ quấn,- Tôi không chắc chắn, nhưng có vẻ như điều này cho phép di chuyển các nhóm
unique_ptrs
bằng cách sử dụngmemmove()
như hoạt động (?), - ngay cả khi nó không thể, toán tử
std::move()
sẽ cho phép di chuyển từng đối tượngunique_ptr
mà không thực hiện cuộc gọi cặp hàm tạo/phá hủy.
unique_ptr
sẽ có độc quyền sở hữu bộ nhớ đã cho. Không có rò rỉ bộ nhớ ngẫu nhiên sẽ có thể.
Điều này có đúng không? Những lợi thế khác của việc sử dụng unique_ptr
là gì?
Nếu yopu muốn viết blog, vui lòng làm như vậy - nhưng không phải ở đây. –
@Neil: Đây là một câu hỏi cụ thể, vấn đề là với nền tảng lớn mà tôi phải đưa vào. Nó * là * hữu ích, ví dụ như câu trả lời của James Hopkin, rằng memcopy() - giống như các hoạt động không làm cho nó thành bản nháp. Làm thế nào khác là tôi giả sử để hỏi về điều đó? Không có nền? Không ai hiểu được! –
Có lẽ nó sẽ được yêu cầu tốt hơn là 'những lợi thế của unique_ptr' là gì. Bạn luôn có thể trả lời câu hỏi của riêng bạn. –