Scoped_ptr có ít điểm chung với shared_ptr, weak_ptr hoặc unique_ptr vì nó chỉ làm trường hợp rất đặc biệt "tính tham chiếu" . Nó không phải là một cái gì đó bạn sẽ cần rất thường xuyên trong mã được thiết kế tốt, nhưng nó là một công cụ tốt để có sẵn.
Về cơ bản, scoped_ptr không phải là điều được tính tham chiếu. Thay vào đó, nó là một đối tượng bạn tạo trên stack (trong phạm vi địa phương) để bạn có thể làm điều gì đó như thế này:
//Some enclosing scope- anything set off by "{}" or even a function:
{
scoped_ptr<MyObject> ptr = new MyObject(parameters...);
} // When we hit this closing brace, "ptr" will delete the "MyObject" inside.
Bạn có xu hướng để xem mô hình này nhiều hơn với mutexes và đồng bộ hóa khác primatives- tôi có thể tuyên bố một "AutoLock" sẽ khóa mutex được truyền vào nó, sau đó mở khóa nó khi nó xóa toàn bộ phạm vi "{}" thành một phần quan trọng.
Cũng lưu ý rằng một 'scoped_ptr' chỉ bao giờ có ý nghĩa khi bạn không thể chỉ làm một phân bổ ngăn xếp đồng bằng cũ như "MyObject obj (params ..)" vì một lý do nào đó. Sau khi tất cả, những gì nó đang làm là cho phép bạn sử dụng một đối tượng phân bổ heap như thể nó là một trên stack.Điều đó có xu hướng hiếm hơn nhiều so với trường hợp sử dụng so với việc đếm tham chiếu của shared_ptr & người anh em họ của nó.
Nguồn
2014-08-01 21:29:44
Mike, tôi không thể đồng ý hơn. Tôi luôn khuyên mọi người nên bắt đầu với 'boost :: scoped_ptr'. Nếu bạn cần chuyển ngữ nghĩa quyền sở hữu (duy trì quyền sở hữu duy nhất) thì hãy "nâng cấp" lên 'std :: auto_ptr'. Nếu bạn chỉ cần chia sẻ quyền sở hữu thì bạn có sử dụng 'boost :: shared_ptr' hay không. Ngoài ra, thư viện 'Boost.ptr_container' là một lựa chọn tốt cho các thùng chứa tăng :: shared_ptr khi các phần tử không thực sự cần được chia sẻ. –
Là một sang một bên: nếu bạn cần chia sẻ con trỏ, bạn có thể loại bỏ các phân bổ bổ sung bằng cách phân bổ các đối tượng bằng cách sử dụng 'make_shared' hoặc' allocate_shared' thay vì 'new'. –
@David: Tôi hầu như đã đồng ý, nhưng tôi sẽ bỏ qua 'auto_ptr' hoàn toàn. Nó không thể được sử dụng một cách an toàn trong các thùng chứa tiêu chuẩn, vì vậy nó có khả năng gây ra một số bất ngờ khó chịu nếu bạn không * thực sự * cẩn thận. – jalf