Tôi đã đánh giá các triển khai con trỏ thông minh khác nhau (wow, có một LOT trên đó) và dường như với tôi rằng hầu hết chúng có thể được phân loại thành hai phân loại rộng:Cách tốt nhất để triển khai con trỏ thông minh trong C++ là gì?
1) Danh mục này sử dụng thừa kế trên các đối tượng được tham chiếu để chúng có số lượng tham chiếu và thường lên() và xuống() (hoặc tương đương của chúng) được triển khai. IE, để sử dụng con trỏ thông minh, các đối tượng mà bạn trỏ vào phải thừa kế từ một số lớp mà triển khai thực hiện cung cấp.
2) Danh mục này sử dụng đối tượng phụ để giữ số lượng tham chiếu. Ví dụ, thay vì trỏ con trỏ thông minh vào đúng đối tượng, nó thực sự trỏ vào đối tượng siêu dữ liệu này ... Ai có một số tham chiếu và lên() và down() triển khai (và thường cung cấp cơ chế cho con trỏ đến nhận được tại các đối tượng thực tế được trỏ đến, để con trỏ thông minh có thể thực hiện đúng toán tử ->()).
Bây giờ, 1 có nhược điểm là nó buộc tất cả các đối tượng bạn muốn tham chiếu đếm để kế thừa từ một tổ tiên chung, và điều này có nghĩa là bạn không thể sử dụng nó để tham chiếu đối tượng đếm mà bạn không có quyền kiểm soát qua mã nguồn.
2 có vấn đề vì số được lưu trữ trong đối tượng khác, nếu bạn có tình huống con trỏ đến đối tượng được tính tham chiếu hiện tại đang được chuyển đổi thành tham chiếu, có thể bạn đã gặp lỗi (IE, vì đếm không nằm trong đối tượng thực sự, không có cách nào để tham chiếu mới nhận số đếm ... ref để sao chép bản dựng hoặc gán là tốt, bởi vì chúng có thể chia sẻ đối tượng đếm, nhưng nếu bạn phải chuyển đổi từ con trỏ, bạn hoàn toàn bị hosed) ...
Bây giờ, khi tôi hiểu nó, hãy tăng :: shared_pointer sử dụng cơ chế 2, hoặc cái gì đó tương tự ... Điều đó nói rằng, tôi hoàn toàn không thể quyết định tệ hơn! Tôi đã từng sử dụng cơ chế 1, trong mã sản xuất ... Có ai có kinh nghiệm với cả hai kiểu dáng? Hoặc có lẽ có một cách khác tốt hơn cả hai thứ này?
Ngoài ra, phiên bản tăng của shared_ptr đã di chuyển vào TR1 và do đó cuối cùng sẽ là thư viện chuẩn C++. –
So sánh hiệu suất của các con trỏ thông minh tăng là ở đây: http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/smarttests.htm –