2012-12-17 74 views
27

C++ 11 có gì tương đương với boost::intrusive_ptr không?intrusive_ptr in C++ 11

Vấn đề của tôi là tôi có giao diện kiểu C trên mã C++ của mình. Cả hai mặt của giao diện đều có thể sử dụng C++, nhưng cần có giao diện C vì lý do tương thích. Tôi không thể sử dụng std::shared_ptr vì tôi phải quản lý đối tượng thông qua hai (hoặc nhiều) con trỏ thông minh. Tôi không thể tìm ra giải pháp với một cái gì đó như boost::intrusive_ptr.

+0

Bạn có thể thực hiện triển khai 'intrusive_ptr' bằng cách sử dụng trình bao bọc xung quanh' unique_ptr' với dấu phân cách tùy chỉnh, cho phép bạn tạo số tham chiếu an toàn (hoặc không). Nó không phải là dễ dàng để vượt qua xung quanh (yêu cầu di chuyển, hoặc thao tác thủ công đếm ref), nhưng có thể. – Chad

Trả lời

33

Có C++ 11 có thứ gì đó tương đương với tăng :: intrusive_ptr không?

số

Nó có std::make_shared có nghĩa std::shared_ptr gần như (xem lưu ý dưới đây) hiệu quả như một con trỏ thông minh xâm nhập, bởi vì số lượng tài liệu tham khảo sẽ được lưu trữ trong bộ nhớ liền kề với đối tượng tự , cải thiện địa phương tham chiếu và sử dụng bộ nhớ cache. Nó cũng cung cấp std::enable_shared_from_this cho phép bạn truy xuất std::shared_ptr khi bạn chỉ có con trỏ cài sẵn cho đối tượng thuộc sở hữu của shared_ptr, nhưng điều đó không cho phép bạn quản lý đối tượng bằng các loại con trỏ thông minh khác nhau.

shared_ptr dự kiến ​​hoàn toàn chịu trách nhiệm quản lý đối tượng. Một loại con trỏ thông minh khác chỉ có thể quản lý số lần truy cập "mạnh" và không phải là số đếm ngược "yếu", điều này sẽ cho phép số lượng không đồng bộ và phá vỡ các bất biến của shared_ptr.


Lưu ý: Sử dụng make_shared phép shared_ptrgần hiệu quả như một con trỏ xâm nhập. Đối tượng và thông tin đếm tham chiếu có thể được phân bổ trong một đoạn bộ nhớ khi sử dụng make_shared nhưng vẫn có hai số tham chiếu (đối với số lượng "mạnh" và "yếu") không phải là trường hợp con trỏ xâm phạm vì họ không hỗ trợ một số weak_ptr. Ngoài ra, đối tượng shared_ptr luôn luôn lưu trữ hai con trỏ (con trỏ sẽ được trả về bởi shared_ptr::get() và một con trỏ khác đến "khối điều khiển" chứa số tham chiếu và biết loại động của đối tượng sở hữu) để có dấu chân lớn hơn hơn một con trỏ xâm nhập.

+9

Con trỏ _intrusive không hỗ trợ weak_ptr_ - Để làm rõ: Con trỏ xâm nhập không thể hỗ trợ (thread-safe) weak_ptr theo thiết kế. Số refcount cần phải được lưu trữ bên ngoài đối tượng, nếu không thì bất kỳ nỗ lực khóa nào trên một con trỏ yếu sẽ chạy đua với sự phá hủy của đối tượng. Nói cách khác: Mỗi con trỏ yếu đã chia sẻ quyền sở hữu trên refcount. Vì vậy, nếu refcounter là không thể tách rời từ đối tượng chính nó (như trường hợp với một con trỏ xâm nhập), con trỏ yếu do đó cũng có (mạnh) chia sẻ quyền sở hữu đối tượng chính nó, mà mâu thuẫn với khái niệm của một con trỏ yếu. – ComicSansMS

+1

@ComicSansMS, thực sự - đó là từ ngữ nghèo nàn về phía tôi. Tôi đã viết lại ghi chú một chút và tôi hy vọng nó rõ ràng hơn. Cảm ơn. –

+2

@ComicSansMS nó không chỉ là một vấn đề với chủ đề: con trỏ yếu không thể kiểm tra nếu đối tượng vẫn còn sống bởi vì nếu nó đã được destructed họ đã đọc 'free'd bộ nhớ – pqnet