Nói chung làm các con trỏ thông minh như std::unique_ptr
và Glib::RefPtr
xóa đối tượng của chúng khi được gán lại để trỏ vào đối tượng khác, vì chúng là con trỏ duy nhất giữ đối tượng đã cho (rõ ràng ngụ ý trong trường hợp std::unique_ptr
)?Chỉ định lại các con trỏ thông minh
Trả lời
Đối unique_ptr::reset
, [unique.ptr.single.modifiers]/4:
Hiệu ứng: gán
p
để con trỏ lưu trữ, và sau đó nếu giá trị cũ của con trỏ lưu trữ,old_p
, không bằngnullptr
, gọiget_deleter()(old_p)
.
Hoặc toán tử gán di chuyển, operator=(unique_ptr&& u)
trong [unique.ptr.single.asgn]/2:
Chuyển quyền sở hữu
u
-*this
như thể bằng cách gọireset(u.release())
Tiếp theoget_deleter() = std::forward<D>(u.get_deleter())
.
(tương đương cho mẫu tử gán khác)
Đối
shared_ptr
, phân công lại là một chút khác nhau.
shared_ptr
sẽ không bao giờ phá hủy một đối tượng được tham chiếu khi nó không phải là đối tượng còn lại cuối cùng sở hữu nó, vì vậy hãy giả sử rằng nó được đưa ra.
shared_ptr::reset(Y*)
quy định cụ thể trong [util.smartptr.shared.mod]/3:
Hiệu ứng: Tương đương với
shared_ptr(p).swap(*this)
.
Nhưng rõ ràng tạm thời bị hủy khi kết thúc cuộc gọi hàm, hủy đối tượng giữ (nếu có).
Đó là cùng một hành vi operator=(shared_ptr<> const&)
có, [util.smartptr.shared.assign]/1 và 4:
Hiệu ứng: Tương đương với
shared_ptr(r).swap(*this)
.
... toán tử gán di chuyển (mẫu), r
là shared_ptr<>&&
:
Hiệu ứng: Tương đương với
shared_ptr(std::move(r)).swap(*this)
.
Nếu *this
là chủ sở hữu cuối cùng, thì hiện tại tạm thời - sẽ bị hủy bên trong.
Đối Glib::RefPtr
kịch bản tương tự như shared_ptr
: Toán tử gán bản sao (và một toán tử gán template) được định nghĩa với ngữ nghĩa tương tự.Nếu hiện tại RefPtr
được gán cho một cái gì đó khác, bộ đếm tham chiếu đối tượng đang giữ đang bị giảm và bị hủy nếu giá trị bộ đếm kết quả bằng không.
Đối unique_ptr câu trả lời là có:
Đối tượng bị phá hủy và bộ nhớ của nó deallocated khi một trong hai sau xảy ra s:
- unique_ptr quản lý các đối tượng bị phá hủy
- unique_ptr quản lý đối tượng được gán một con trỏ khác qua toán tử = hoặc reset().
Đối tượng bị hủy bằng cách sử dụng nhà cung cấp có khả năng do người dùng cung cấp bởi gọi Deleter (ptr). Các deleter gọi destructor của đối tượng và phân phát bộ nhớ.
- 1. Sự khác biệt giữa các con trỏ thông minh Boost và con trỏ thông minh tiêu chuẩn là gì?
- 2. Con trỏ thông minh và tham khảo
- 3. Con trỏ & phá hủy thông minh
- 4. OpenCV hoặc Boost con trỏ thông minh
- 5. Con trỏ thông minh trong Qt
- 6. C++ Hiệu suất con trỏ thông minh
- 7. con trỏ thông minh với SDL
- 8. Quy tắc ba với con trỏ thông minh?
- 9. pimpl-idiom trong mẫu; con trỏ thông minh nào?
- 10. Mảng động được gán và con trỏ thông minh
- 11. khởi động đúng cách thông minh con trỏ mảng
- 12. Con trỏ thông minh và đếm số liệu trong Java
- 13. Vector của con trỏ thông minh destructor gọi
- 14. thành ngữ hàm tạo ảo với con trỏ thông minh
- 15. sử dụng mem_fun() cho vùng chứa con trỏ thông minh
- 16. C++ 11 con trỏ thông minh và đa hình
- 17. Chỉ định con trỏ C++
- 18. Con trỏ thông minh và xử lý ngoại lệ
- 19. Khi nào tôi nên sử dụng con trỏ thô trên con trỏ thông minh?
- 20. thúc đẩy con trỏ thông minh và BOOST_NO_MEMBER_TEMPLATES
- 21. Con trỏ thông minh làm khóa bản đồ
- 22. Đưa con trỏ đến một đối tượng được trỏ tới bởi con trỏ thông minh - Lỗi Ivalue
- 23. Làm thế nào để ép buộc chỉ trình con trỏ thông minh cho một lớp học?
- 24. Tôi có thể viết một hàm C++ chấp nhận cả một con trỏ thô và một con trỏ thông minh?
- 25. Làm cách nào để chỉ bao gồm các mã con trỏ thông minh BOOST vào một dự án?
- 26. trả về một 'con trỏ' được yêu cầu phải được giữ bởi một con trỏ thông minh
- 27. Con trỏ thông minh/quản lý bộ nhớ an toàn cho C?
- 28. Hình phạt gói con trỏ thông minh. Bản ghi nhớ với std :: map
- 29. Có thể sử dụng một con trỏ thông minh C++ cùng với malloc của C không?
- 30. Chuyển đổi không hợp lệ? Chỉ định con trỏ const cho con trỏ
RefPtr something = getSomething(); something = getSomethingElse(); hoạt động tốt. Bạn không cần sử dụng RefPtr :: swap(). Tất nhiên việc phân công lại ở đây chỉ làm giảm tham chiếu trên Cái gì đó đầu tiên thay vì xóa nó. Đó là một con trỏ thông minh _shared_ đếm tham chiếu. –
murrayc
@murrayc Tôi phải đọc sai tài liệu lần đầu tiên tôi xem qua. Cảm ơn! – Columbo