2011-01-09 37 views
7

Tôi đã tìm kiếm cách để thực hiện các vectơ an toàn và bản đồ các con trỏ động, khi tôi nhận ra C++ 11 thêm unique_ptr s. Tôi đã xem xét cách sử dụng chúng trên Google, nhưng đã không thành công trong việc tìm kiếm chi tiết. Những gì tôi cần biết là:Sử dụng std :: unique_ptr với các thùng chứa tiêu chuẩn

  1. Điều gì khác biệt giữa các con trỏ và unique_ptr ngoài bộ sưu tập bộ nhớ tự động?
  2. Tôi làm cách nào để xóa unique_ptr khỏi vectơ hoặc bản đồ? Có bất kỳ mã đặc biệt tôi phải sử dụng ngoài việc xóa các iterator?
+1

Unique_ptr có phải là điều kiện thiết yếu không? Nếu an toàn là mục đích của bạn, tiêu chuẩn :: shared_ptr có thể là một thay thế. –

Trả lời

13
  1. Không có gì. Một unique_ptr chỉ là một trình bao bọc xung quanh một con trỏ, sẽ xóa con trỏ khi unique_ptr bị hủy. Nó không có phí (giống như mẫu auto_ptr nó thay thế).
  2. Không - nó sẽ chỉ hoạt động. Khó khăn thực sự xuất phát từ việc gắn con trỏ vào vectơ hoặc bản đồ - trong khi bạn phải di chuyểnunique_ptr vào vùng chứa.
+0

Cảm ơn! Tôi đã không hoàn toàn chắc chắn, và không thể tìm thấy nhiều trên Google, vì vậy tôi rất vui khi nhận được câu trả lời. – OniLink

+1

+1 cho một lời giải thích tốt, mặc dù bạn có thể muốn lưu ý rằng nhiều nhất một unique_ptr có thể trỏ vào một tài nguyên, trong khi một số lượng lớn không liên kết các con trỏ thô có thể trỏ đến một tài nguyên cụ thể. – templatetypedef

+2

+1, có lẽ thêm một ví dụ về chèn (đặc biệt là một trong những hiển thị tại sao di chuyển là cần thiết) sẽ giúp đỡ. –

4
  1. Sự khác biệt là unique_ptr tuân theo ngữ nghĩa di chuyển. Hơn nữa, như tên cho thấy, bạn không thể tạo bản sao của nó.

  2. Xóa phần tử std::vector<std::unique_ptr<T> > sẽ xóa hiệu quả mọi thứ mà con trỏ trỏ đến.

+0

+1 cho 2. - hiển nhiên khi bạn tập trung vào nó, nhưng có thể là một vấn đề trong quá trình chuyển từ con trỏ thô sang con trỏ thông minh, nếu bạn chỉ đi "nửa đường" với con trỏ thô trỏ đến bộ nhớ giải phóng vì một mục đã bị xóa – kfmfe04

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