hồn.smartptr. Shared.const / 9 trong C ++ 11:
Hiệu ứng: Xây dựng một đối tượng shared_ptr sở hữu đối tượng p và deleter d. Các constructor thứ hai và thứ tư sẽ sử dụng một bản sao của một bộ nhớ để phân bổ bộ nhớ cho sử dụng nội bộ.
Các constructor thứ hai và thứ tư có các nguyên mẫu này:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
Trong dự thảo mới nhất, produc.smartptr. Shared.const / 10 tương đương với mục đích của chúng tôi:
Hiệu ứng: Xây dựng một đối tượng shared_ptr sở hữu đối tượng p và deleter d. Khi T không phải là kiểu mảng, các hàm tạo thứ nhất và thứ hai cho phép shared_from_this với p. Các constructor thứ hai và thứ tư sẽ sử dụng một bản sao của một bộ nhớ để phân bổ bộ nhớ cho sử dụng nội bộ. Nếu một ngoại lệ được ném, d (p) được gọi.
Vì vậy, bộ cấp phát được sử dụng nếu có nhu cầu phân bổ nó trong bộ nhớ được phân bổ. Dựa trên tiêu chuẩn hiện tại và tại các báo cáo khiếm khuyết có liên quan, việc phân bổ không bắt buộc mà do ủy ban đảm nhận.
Mặc dù giao diện shared_ptr
cho phép thực hiện trong đó không bao giờ có khối điều khiển và tất cả shared_ptr
và weak_ptr
được đưa vào danh sách được liên kết, nhưng thực tế không có triển khai như vậy. Ngoài ra, ví dụ, từ ngữ đã được sửa đổi, giả sử rằng từ use_count
được chia sẻ.
Deleter được yêu cầu chỉ di chuyển có thể xây dựng. Vì vậy, không thể có một vài bản sao trong shared_ptr
.
Người ta có thể tưởng tượng một triển khai đưa deleter vào một thiết kế đặc biệt shared_ptr
và di chuyển nó khi nó đặc biệt shared_ptr
bị xóa. Mặc dù việc triển khai có vẻ phù hợp, nhưng điều này cũng lạ, đặc biệt là vì khối điều khiển có thể cần thiết cho số lượng sử dụng (có lẽ có thể nhưng thậm chí còn lạ hơn khi làm điều tương tự với số lượng sử dụng).
Các DR có liên quan tôi đã tìm thấy: 545 , 575 , 2434 (thừa nhận rằng tất cả các triển khai đang sử dụng một khối điều khiển và dường như ngụ ý rằng các ràng buộc đa luồng phần nào bắt buộc nó), 2802 (yêu cầu rằng deleter chỉ di chuyển có thể xây dựng được và do đó ngăn cản việc thực hiện deleter được sao chép giữa một số shared_ptr
).